2018-08-21 21:24:40 +00:00
|
|
|
import logging
|
|
|
|
import subprocess
|
2018-04-03 17:11:29 +00:00
|
|
|
from django.contrib.sites.models import Site
|
|
|
|
|
2018-04-20 14:55:24 +00:00
|
|
|
from datacenterlight.tasks import create_vm_task
|
2018-07-01 20:30:23 +00:00
|
|
|
from hosting.models import HostingOrder, HostingBill, OrderDetail
|
2018-04-20 14:55:24 +00:00
|
|
|
from membership.models import StripeCustomer
|
|
|
|
from utils.forms import UserBillingAddressForm
|
|
|
|
from utils.models import BillingAddress
|
2018-04-03 17:11:29 +00:00
|
|
|
from .cms_models import CMSIntegration
|
2018-07-01 16:33:10 +00:00
|
|
|
from .models import VMPricing, VMTemplate
|
2018-04-03 17:11:29 +00:00
|
|
|
|
2018-08-21 21:24:40 +00:00
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
2018-04-03 17:11:29 +00:00
|
|
|
|
|
|
|
def get_cms_integration(name):
|
|
|
|
current_site = Site.objects.get_current()
|
|
|
|
try:
|
|
|
|
cms_integration = CMSIntegration.objects.get(
|
|
|
|
name=name, domain=current_site
|
|
|
|
)
|
|
|
|
except CMSIntegration.DoesNotExist:
|
|
|
|
cms_integration = CMSIntegration.objects.get(name=name, domain=None)
|
|
|
|
return cms_integration
|
2018-04-20 14:55:24 +00:00
|
|
|
|
|
|
|
|
|
|
|
def create_vm(billing_address_data, stripe_customer_id, specs,
|
|
|
|
stripe_subscription_obj, card_details_dict, request,
|
|
|
|
vm_template_id, template, user):
|
|
|
|
billing_address = BillingAddress(
|
|
|
|
cardholder_name=billing_address_data['cardholder_name'],
|
|
|
|
street_address=billing_address_data['street_address'],
|
|
|
|
city=billing_address_data['city'],
|
|
|
|
postal_code=billing_address_data['postal_code'],
|
|
|
|
country=billing_address_data['country']
|
|
|
|
)
|
|
|
|
billing_address.save()
|
|
|
|
customer = StripeCustomer.objects.filter(id=stripe_customer_id).first()
|
2018-04-21 15:31:42 +00:00
|
|
|
vm_pricing = (
|
|
|
|
VMPricing.get_vm_pricing_by_name(name=specs['pricing_name'])
|
|
|
|
if 'pricing_name' in specs else
|
|
|
|
VMPricing.get_default_pricing()
|
|
|
|
)
|
|
|
|
|
|
|
|
final_price = (
|
|
|
|
specs.get('total_price')
|
|
|
|
if 'total_price' in specs
|
|
|
|
else specs.get('price')
|
|
|
|
)
|
2018-04-20 14:55:24 +00:00
|
|
|
|
|
|
|
# Create a Hosting Order with vm_id = 0, we shall set it later in
|
|
|
|
# celery task once the VM instance is up and running
|
|
|
|
order = HostingOrder.create(
|
2018-04-21 15:31:42 +00:00
|
|
|
price=final_price,
|
2018-04-20 14:55:24 +00:00
|
|
|
customer=customer,
|
2018-04-21 15:31:42 +00:00
|
|
|
billing_address=billing_address,
|
|
|
|
vm_pricing=vm_pricing
|
2018-04-20 14:55:24 +00:00
|
|
|
)
|
|
|
|
|
2018-07-01 20:30:23 +00:00
|
|
|
order_detail_obj, obj_created = OrderDetail.objects.get_or_create(
|
2018-07-01 16:42:11 +00:00
|
|
|
vm_template=VMTemplate.objects.get(
|
|
|
|
opennebula_vm_template_id=vm_template_id
|
|
|
|
),
|
2018-07-01 16:33:10 +00:00
|
|
|
cores=specs['cpu'], memory=specs['memory'], ssd_size=specs['disk_size']
|
|
|
|
)
|
2018-07-01 20:30:23 +00:00
|
|
|
order.order_detail = order_detail_obj
|
2018-07-01 16:33:10 +00:00
|
|
|
order.save()
|
|
|
|
|
2018-04-20 14:55:24 +00:00
|
|
|
# Create a Hosting Bill
|
|
|
|
HostingBill.create(customer=customer, billing_address=billing_address)
|
|
|
|
|
|
|
|
# Create Billing Address for User if he does not have one
|
|
|
|
if not customer.user.billing_addresses.count():
|
|
|
|
billing_address_data.update({
|
|
|
|
'user': customer.user.id
|
|
|
|
})
|
|
|
|
billing_address_user_form = UserBillingAddressForm(
|
|
|
|
billing_address_data
|
|
|
|
)
|
|
|
|
billing_address_user_form.is_valid()
|
|
|
|
billing_address_user_form.save()
|
|
|
|
|
2018-06-27 10:24:53 +00:00
|
|
|
# Associate the given stripe subscription with the order
|
2018-04-20 14:55:24 +00:00
|
|
|
order.set_subscription_id(
|
|
|
|
stripe_subscription_obj.id, card_details_dict
|
|
|
|
)
|
|
|
|
|
2018-06-27 10:24:53 +00:00
|
|
|
# Set order status approved
|
2018-04-20 14:55:24 +00:00
|
|
|
order.set_approved()
|
|
|
|
|
|
|
|
create_vm_task.delay(vm_template_id, user, specs, template, order.id)
|
|
|
|
|
|
|
|
for session_var in ['specs', 'template', 'billing_address',
|
2018-07-03 19:29:04 +00:00
|
|
|
'billing_address_data', 'card_id',
|
2018-04-20 14:55:24 +00:00
|
|
|
'token', 'customer']:
|
|
|
|
if session_var in request.session:
|
|
|
|
del request.session[session_var]
|
2018-08-21 21:24:40 +00:00
|
|
|
|
|
|
|
|
|
|
|
def ping_ok(host_ipv6):
|
|
|
|
"""
|
|
|
|
A utility method to check if a host responds to ping requests. Note: the
|
|
|
|
function relies on `ping6` utility of debian to check.
|
|
|
|
|
|
|
|
:param host_ipv6 str type parameter that represets the ipv6 of the host to
|
|
|
|
checked
|
|
|
|
:return True if the host responds to ping else returns False
|
|
|
|
"""
|
|
|
|
try:
|
|
|
|
output = subprocess.check_output("ping6 -c 1 -w 2 " + host_ipv6,
|
|
|
|
shell=True)
|
|
|
|
except Exception as ex:
|
|
|
|
logger.debug(host_ipv6 + " not reachable via ping. Error = " + str(ex))
|
|
|
|
return False
|
|
|
|
return True
|