Merge pull request #672 from pcoder/task/5681/offer-512mb-ram
Allow admin to lower the minimum RAM for a calculator instance to 512 MB
This commit is contained in:
commit
961bf2e46f
9 changed files with 171 additions and 26 deletions
|
@ -361,3 +361,4 @@ class DCLCalculatorPluginModel(CMSPlugin):
|
||||||
help_text="Write the name of the template that you need selected as"
|
help_text="Write the name of the template that you need selected as"
|
||||||
" default when the calculator loads"
|
" default when the calculator loads"
|
||||||
)
|
)
|
||||||
|
enable_512mb_ram = models.BooleanField(default=False)
|
||||||
|
|
|
@ -99,9 +99,8 @@ class DCLCalculatorPlugin(CMSPluginBase):
|
||||||
context['templates'] = VMTemplate.objects.filter(
|
context['templates'] = VMTemplate.objects.filter(
|
||||||
vm_type=instance.vm_type
|
vm_type=instance.vm_type
|
||||||
).order_by('name')
|
).order_by('name')
|
||||||
context['default_selected_template'] = (
|
context['instance'] = instance
|
||||||
instance.default_selected_template
|
context['min_ram'] = 0.5 if instance.enable_512mb_ram else 1
|
||||||
)
|
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.9.4 on 2018-09-29 05:36
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('datacenterlight', '0026_dclcalculatorpluginmodel_default_selected_template'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='dclcalculatorpluginmodel',
|
||||||
|
name='enable_512mb_ram',
|
||||||
|
field=models.BooleanField(default=False),
|
||||||
|
),
|
||||||
|
]
|
|
@ -5,6 +5,10 @@
|
||||||
/* ---------------------------------------------
|
/* ---------------------------------------------
|
||||||
Scripts initialization
|
Scripts initialization
|
||||||
--------------------------------------------- */
|
--------------------------------------------- */
|
||||||
|
var minRam = 1;
|
||||||
|
if(window.minRam){
|
||||||
|
minRam = window.minRam;
|
||||||
|
}
|
||||||
var cardPricing = {
|
var cardPricing = {
|
||||||
'cpu': {
|
'cpu': {
|
||||||
'id': 'coreValue',
|
'id': 'coreValue',
|
||||||
|
@ -16,7 +20,7 @@
|
||||||
'ram': {
|
'ram': {
|
||||||
'id': 'ramValue',
|
'id': 'ramValue',
|
||||||
'value': 2,
|
'value': 2,
|
||||||
'min': 1,
|
'min': minRam,
|
||||||
'max': 200,
|
'max': 200,
|
||||||
'interval': 1
|
'interval': 1
|
||||||
},
|
},
|
||||||
|
@ -40,6 +44,7 @@
|
||||||
_initNavUrl();
|
_initNavUrl();
|
||||||
_initPricing();
|
_initPricing();
|
||||||
ajaxForms();
|
ajaxForms();
|
||||||
|
$('#ramValue').data('old-value', $('#ramValue').val());
|
||||||
});
|
});
|
||||||
|
|
||||||
$(window).resize(function() {
|
$(window).resize(function() {
|
||||||
|
@ -144,21 +149,54 @@
|
||||||
var data = $(this).data('minus');
|
var data = $(this).data('minus');
|
||||||
|
|
||||||
if (cardPricing[data].value > cardPricing[data].min) {
|
if (cardPricing[data].value > cardPricing[data].min) {
|
||||||
|
if(data === 'ram' && String(cardPricing[data].value) === "1" && minRam === 0.5){
|
||||||
|
cardPricing[data].value = 0.5;
|
||||||
|
$('#ramValue').val('0.5');
|
||||||
|
$("#ramValue").attr('step', 0.5);
|
||||||
|
} else {
|
||||||
cardPricing[data].value = Number(cardPricing[data].value) - cardPricing[data].interval;
|
cardPricing[data].value = Number(cardPricing[data].value) - cardPricing[data].interval;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
_fetchPricing();
|
_fetchPricing();
|
||||||
|
$('#ramValue').data('old-value', $('#ramValue').val());
|
||||||
});
|
});
|
||||||
$('.fa-plus-circle.right').click(function(event) {
|
$('.fa-plus-circle.right').click(function(event) {
|
||||||
var data = $(this).data('plus');
|
var data = $(this).data('plus');
|
||||||
if (cardPricing[data].value < cardPricing[data].max) {
|
if (cardPricing[data].value < cardPricing[data].max) {
|
||||||
|
if(data === 'ram' && String(cardPricing[data].value) === "0.5" && minRam === 0.5){
|
||||||
|
cardPricing[data].value = 1;
|
||||||
|
$('#ramValue').val('1');
|
||||||
|
$("#ramValue").attr('step', 1);
|
||||||
|
} else {
|
||||||
cardPricing[data].value = Number(cardPricing[data].value) + cardPricing[data].interval;
|
cardPricing[data].value = Number(cardPricing[data].value) + cardPricing[data].interval;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
_fetchPricing();
|
_fetchPricing();
|
||||||
|
$('#ramValue').data('old-value', $('#ramValue').val());
|
||||||
});
|
});
|
||||||
|
|
||||||
$('.input-price').change(function() {
|
$('.input-price').change(function() {
|
||||||
var data = $(this).attr("name");
|
var data = $(this).attr("name");
|
||||||
cardPricing[data].value = $('input[name=' + data + ']').val();
|
var input = $('input[name=' + data + ']');
|
||||||
|
var inputValue = input.val();
|
||||||
|
|
||||||
|
if(data === 'ram') {
|
||||||
|
var ramInput = $('#ramValue');
|
||||||
|
if ($('#ramValue').data('old-value') < $('#ramValue').val()) {
|
||||||
|
if($('#ramValue').val() === '1' && minRam === 0.5) {
|
||||||
|
$("#ramValue").attr('step', 1);
|
||||||
|
$('#ramValue').val('1');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if($('#ramValue').val() === '0' && minRam === 0.5) {
|
||||||
|
$("#ramValue").attr('step', 0.5);
|
||||||
|
$('#ramValue').val('0.5');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
inputValue = $('#ramValue').val();
|
||||||
|
$('#ramValue').data('old-value', $('#ramValue').val());
|
||||||
|
}
|
||||||
|
cardPricing[data].value = inputValue;
|
||||||
_fetchPricing();
|
_fetchPricing();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,11 +9,14 @@
|
||||||
window.ssdUnitPrice = {{vm_pricing.ssd_unit_price|default:0}};
|
window.ssdUnitPrice = {{vm_pricing.ssd_unit_price|default:0}};
|
||||||
window.hddUnitPrice = {{vm_pricing.hdd_unit_price|default:0}};
|
window.hddUnitPrice = {{vm_pricing.hdd_unit_price|default:0}};
|
||||||
window.discountAmount = {{vm_pricing.discount_amount|default:0}};
|
window.discountAmount = {{vm_pricing.discount_amount|default:0}};
|
||||||
|
window.minRam = {{min_ram}};
|
||||||
|
window.minRamErr = '{% blocktrans with min_ram=min_ram %}Please enter a value in range {{min_ram}} - 200.{% endblocktrans %}';
|
||||||
</script>
|
</script>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<form id="order_form" method="POST" action="{{calculator_form_url}}" data-toggle="validator" role="form">
|
<form id="order_form" method="POST" action="{{calculator_form_url}}" data-toggle="validator" role="form">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
|
<input type="hidden" name="pid" value="{{instance.id}}">
|
||||||
<div class="title">
|
<div class="title">
|
||||||
<h3>{% trans "VM hosting" %} </h3>
|
<h3>{% trans "VM hosting" %} </h3>
|
||||||
</div>
|
</div>
|
||||||
|
@ -54,8 +57,8 @@
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="description input">
|
<div class="description input">
|
||||||
<i class="fa fa-minus-circle left" data-minus="ram" aria-hidden="true"></i>
|
<i class="fa fa-minus-circle left" data-minus="ram" aria-hidden="true"></i>
|
||||||
<input id="ramValue" class="input-price select-number" type="number" min="1" max="200" name="ram"
|
<input id="ramValue" class="input-price select-number" type="number" min="{% if min_ram == 0.5 %}0{% else %}1{% endif %}" max="200" name="ram"
|
||||||
data-error="{% trans 'Please enter a value in range 1 - 200.' %}" required>
|
data-error="{% blocktrans with min_ram=min_ram %}Please enter a value in range {{min_ram}} - 200.{% endblocktrans %}" required step="1">
|
||||||
<span> GB RAM</span>
|
<span> GB RAM</span>
|
||||||
<i class="fa fa-plus-circle right" data-plus="ram" aria-hidden="true"></i>
|
<i class="fa fa-plus-circle right" data-plus="ram" aria-hidden="true"></i>
|
||||||
</div>
|
</div>
|
||||||
|
@ -92,7 +95,7 @@
|
||||||
<select name="config">
|
<select name="config">
|
||||||
{% for template in templates %}
|
{% for template in templates %}
|
||||||
|
|
||||||
<option value="{{template.opennebula_vm_template_id}}" {% if template.name|lower == default_selected_template|lower %}selected="selected"{% endif %}>{{template.name}}</option>
|
<option value="{{template.opennebula_vm_template_id}}" {% if template.name|lower == instance.default_selected_template|lower %}selected="selected"{% endif %}>{{template.name}}</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -27,6 +27,7 @@ from utils.forms import (
|
||||||
from utils.hosting_utils import get_vm_price_with_vat
|
from utils.hosting_utils import get_vm_price_with_vat
|
||||||
from utils.stripe_utils import StripeUtils
|
from utils.stripe_utils import StripeUtils
|
||||||
from utils.tasks import send_plain_email_task
|
from utils.tasks import send_plain_email_task
|
||||||
|
from .cms_models import DCLCalculatorPluginModel
|
||||||
from .forms import ContactForm
|
from .forms import ContactForm
|
||||||
from .models import VMTemplate, VMPricing
|
from .models import VMTemplate, VMPricing
|
||||||
from .utils import get_cms_integration, create_vm, clear_all_session_vars
|
from .utils import get_cms_integration, create_vm, clear_all_session_vars
|
||||||
|
@ -89,7 +90,29 @@ class IndexView(CreateView):
|
||||||
raise ValidationError(_('Invalid number of cores'))
|
raise ValidationError(_('Invalid number of cores'))
|
||||||
|
|
||||||
def validate_memory(self, value):
|
def validate_memory(self, value):
|
||||||
if (value > 200) or (value < 1):
|
if 'pid' in self.request.POST:
|
||||||
|
try:
|
||||||
|
plugin = DCLCalculatorPluginModel.objects.get(
|
||||||
|
id=self.request.POST['pid']
|
||||||
|
)
|
||||||
|
except DCLCalculatorPluginModel.DoesNotExist as dne:
|
||||||
|
logger.error(
|
||||||
|
str(dne) + " plugin_id: " + self.request.POST['pid']
|
||||||
|
)
|
||||||
|
raise ValidationError(_('Invalid calculator properties'))
|
||||||
|
if plugin.enable_512mb_ram:
|
||||||
|
if value % 1 == 0 or value == 0.5:
|
||||||
|
logger.debug(
|
||||||
|
"Given ram {value} is either 0.5 or a"
|
||||||
|
" whole number".format(value=value)
|
||||||
|
)
|
||||||
|
if (value > 200) or (value < 0.5):
|
||||||
|
raise ValidationError(_('Invalid RAM size'))
|
||||||
|
else:
|
||||||
|
raise ValidationError(_('Invalid RAM size'))
|
||||||
|
elif (value > 200) or (value < 1) or (value % 1 != 0):
|
||||||
|
raise ValidationError(_('Invalid RAM size'))
|
||||||
|
else:
|
||||||
raise ValidationError(_('Invalid RAM size'))
|
raise ValidationError(_('Invalid RAM size'))
|
||||||
|
|
||||||
def validate_storage(self, value):
|
def validate_storage(self, value):
|
||||||
|
@ -105,7 +128,7 @@ class IndexView(CreateView):
|
||||||
cores = request.POST.get('cpu')
|
cores = request.POST.get('cpu')
|
||||||
cores_field = forms.IntegerField(validators=[self.validate_cores])
|
cores_field = forms.IntegerField(validators=[self.validate_cores])
|
||||||
memory = request.POST.get('ram')
|
memory = request.POST.get('ram')
|
||||||
memory_field = forms.IntegerField(validators=[self.validate_memory])
|
memory_field = forms.FloatField(validators=[self.validate_memory])
|
||||||
storage = request.POST.get('storage')
|
storage = request.POST.get('storage')
|
||||||
storage_field = forms.IntegerField(validators=[self.validate_storage])
|
storage_field = forms.IntegerField(validators=[self.validate_storage])
|
||||||
template_id = int(request.POST.get('config'))
|
template_id = int(request.POST.get('config'))
|
||||||
|
@ -174,7 +197,7 @@ class IndexView(CreateView):
|
||||||
'vat': vat,
|
'vat': vat,
|
||||||
'vat_percent': vat_percent,
|
'vat_percent': vat_percent,
|
||||||
'discount': discount,
|
'discount': discount,
|
||||||
'total_price': price + vat - discount['amount'],
|
'total_price': round(price + vat - discount['amount'], 2),
|
||||||
'pricing_name': vm_pricing_name
|
'pricing_name': vm_pricing_name
|
||||||
}
|
}
|
||||||
request.session['specs'] = specs
|
request.session['specs'] = specs
|
||||||
|
|
|
@ -157,6 +157,10 @@ $( document ).ready(function() {
|
||||||
/* ---------------------------------------------
|
/* ---------------------------------------------
|
||||||
Scripts initialization
|
Scripts initialization
|
||||||
--------------------------------------------- */
|
--------------------------------------------- */
|
||||||
|
var minRam = 1;
|
||||||
|
if(window.minRam){
|
||||||
|
minRam = window.minRam;
|
||||||
|
}
|
||||||
var cardPricing = {
|
var cardPricing = {
|
||||||
'cpu': {
|
'cpu': {
|
||||||
'id': 'coreValue',
|
'id': 'coreValue',
|
||||||
|
@ -168,7 +172,7 @@ $( document ).ready(function() {
|
||||||
'ram': {
|
'ram': {
|
||||||
'id': 'ramValue',
|
'id': 'ramValue',
|
||||||
'value': 2,
|
'value': 2,
|
||||||
'min': 1,
|
'min': minRam,
|
||||||
'max': 200,
|
'max': 200,
|
||||||
'interval': 1
|
'interval': 1
|
||||||
},
|
},
|
||||||
|
@ -188,21 +192,54 @@ $( document ).ready(function() {
|
||||||
var data = $(this).data('minus');
|
var data = $(this).data('minus');
|
||||||
|
|
||||||
if (cardPricing[data].value > cardPricing[data].min) {
|
if (cardPricing[data].value > cardPricing[data].min) {
|
||||||
|
if(data === 'ram' && String(cardPricing[data].value) === "1" && minRam === 0.5){
|
||||||
|
cardPricing[data].value = 0.5;
|
||||||
|
$('#ramValue').val('0.5');
|
||||||
|
$("#ramValue").attr('step', 0.5);
|
||||||
|
} else {
|
||||||
cardPricing[data].value = Number(cardPricing[data].value) - cardPricing[data].interval;
|
cardPricing[data].value = Number(cardPricing[data].value) - cardPricing[data].interval;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
_fetchPricing();
|
_fetchPricing();
|
||||||
|
$('#ramValue').data('old-value', $('#ramValue').val());
|
||||||
});
|
});
|
||||||
$('.fa-plus-circle.right').click(function(event) {
|
$('.fa-plus-circle.right').click(function(event) {
|
||||||
var data = $(this).data('plus');
|
var data = $(this).data('plus');
|
||||||
if (cardPricing[data].value < cardPricing[data].max) {
|
if (cardPricing[data].value < cardPricing[data].max) {
|
||||||
|
if(data === 'ram' && String(cardPricing[data].value) === "0.5" && minRam === 0.5){
|
||||||
|
cardPricing[data].value = 1;
|
||||||
|
$('#ramValue').val('1');
|
||||||
|
$("#ramValue").attr('step', 1);
|
||||||
|
} else {
|
||||||
cardPricing[data].value = Number(cardPricing[data].value) + cardPricing[data].interval;
|
cardPricing[data].value = Number(cardPricing[data].value) + cardPricing[data].interval;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
_fetchPricing();
|
_fetchPricing();
|
||||||
|
$('#ramValue').data('old-value', $('#ramValue').val());
|
||||||
});
|
});
|
||||||
|
|
||||||
$('.input-price').change(function() {
|
$('.input-price').change(function() {
|
||||||
var data = $(this).attr("name");
|
var data = $(this).attr("name");
|
||||||
cardPricing[data].value = $('input[name=' + data + ']').val();
|
var input = $('input[name=' + data + ']');
|
||||||
|
var inputValue = input.val();
|
||||||
|
|
||||||
|
if(data === 'ram') {
|
||||||
|
var ramInput = $('#ramValue');
|
||||||
|
if ($('#ramValue').data('old-value') < $('#ramValue').val()) {
|
||||||
|
if($('#ramValue').val() === '1' && minRam === 0.5) {
|
||||||
|
$("#ramValue").attr('step', 1);
|
||||||
|
$('#ramValue').val('1');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if($('#ramValue').val() === '0' && minRam === 0.5) {
|
||||||
|
$("#ramValue").attr('step', 0.5);
|
||||||
|
$('#ramValue').val('0.5');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
inputValue = $('#ramValue').val();
|
||||||
|
$('#ramValue').data('old-value', $('#ramValue').val());
|
||||||
|
}
|
||||||
|
cardPricing[data].value = inputValue;
|
||||||
_fetchPricing();
|
_fetchPricing();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -236,4 +273,5 @@ $( document ).ready(function() {
|
||||||
}
|
}
|
||||||
|
|
||||||
_initPricing();
|
_initPricing();
|
||||||
|
$('#ramValue').data('old-value', $('#ramValue').val());
|
||||||
});
|
});
|
|
@ -32,6 +32,7 @@ from stored_messages.api import mark_read
|
||||||
from stored_messages.models import Message
|
from stored_messages.models import Message
|
||||||
from stored_messages.settings import stored_messages_settings
|
from stored_messages.settings import stored_messages_settings
|
||||||
|
|
||||||
|
from datacenterlight.cms_models import DCLCalculatorPluginModel
|
||||||
from datacenterlight.models import VMTemplate, VMPricing
|
from datacenterlight.models import VMTemplate, VMPricing
|
||||||
from datacenterlight.utils import create_vm, get_cms_integration
|
from datacenterlight.utils import create_vm, get_cms_integration
|
||||||
from hosting.models import UserCardDetail
|
from hosting.models import UserCardDetail
|
||||||
|
@ -1198,7 +1199,29 @@ class CreateVirtualMachinesView(LoginRequiredMixin, View):
|
||||||
raise ValidationError(_('Invalid number of cores'))
|
raise ValidationError(_('Invalid number of cores'))
|
||||||
|
|
||||||
def validate_memory(self, value):
|
def validate_memory(self, value):
|
||||||
if (value > 200) or (value < 1):
|
if 'pid' in self.request.POST:
|
||||||
|
try:
|
||||||
|
plugin = DCLCalculatorPluginModel.objects.get(
|
||||||
|
id=self.request.POST['pid']
|
||||||
|
)
|
||||||
|
except DCLCalculatorPluginModel.DoesNotExist as dne:
|
||||||
|
logger.error(
|
||||||
|
str(dne) + " plugin_id: " + self.request.POST['pid']
|
||||||
|
)
|
||||||
|
raise ValidationError(_('Invalid calculator properties'))
|
||||||
|
if plugin.enable_512mb_ram:
|
||||||
|
if value % 1 == 0 or value == 0.5:
|
||||||
|
logger.debug(
|
||||||
|
"Given ram {value} is either 0.5 or a"
|
||||||
|
" whole number".format(value=value)
|
||||||
|
)
|
||||||
|
if (value > 200) or (value < 0.5):
|
||||||
|
raise ValidationError(_('Invalid RAM size'))
|
||||||
|
else:
|
||||||
|
raise ValidationError(_('Invalid RAM size'))
|
||||||
|
elif (value > 200) or (value < 1) or (value % 1 != 0):
|
||||||
|
raise ValidationError(_('Invalid RAM size'))
|
||||||
|
else:
|
||||||
raise ValidationError(_('Invalid RAM size'))
|
raise ValidationError(_('Invalid RAM size'))
|
||||||
|
|
||||||
def validate_storage(self, value):
|
def validate_storage(self, value):
|
||||||
|
@ -1218,7 +1241,7 @@ class CreateVirtualMachinesView(LoginRequiredMixin, View):
|
||||||
cores = request.POST.get('cpu')
|
cores = request.POST.get('cpu')
|
||||||
cores_field = forms.IntegerField(validators=[self.validate_cores])
|
cores_field = forms.IntegerField(validators=[self.validate_cores])
|
||||||
memory = request.POST.get('ram')
|
memory = request.POST.get('ram')
|
||||||
memory_field = forms.IntegerField(validators=[self.validate_memory])
|
memory_field = forms.FloatField(validators=[self.validate_memory])
|
||||||
storage = request.POST.get('storage')
|
storage = request.POST.get('storage')
|
||||||
storage_field = forms.IntegerField(validators=[self.validate_storage])
|
storage_field = forms.IntegerField(validators=[self.validate_storage])
|
||||||
template_id = int(request.POST.get('config'))
|
template_id = int(request.POST.get('config'))
|
||||||
|
@ -1282,7 +1305,7 @@ class CreateVirtualMachinesView(LoginRequiredMixin, View):
|
||||||
'price': price,
|
'price': price,
|
||||||
'vat': vat,
|
'vat': vat,
|
||||||
'vat_percent': vat_percent,
|
'vat_percent': vat_percent,
|
||||||
'total_price': price + vat - discount['amount'],
|
'total_price': round(price + vat - discount['amount'], 2),
|
||||||
'pricing_name': vm_pricing_name
|
'pricing_name': vm_pricing_name
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -249,8 +249,8 @@ class OpenNebulaManager():
|
||||||
vm_specs = vm_specs_formatter.format(
|
vm_specs = vm_specs_formatter.format(
|
||||||
vcpu=int(specs['cpu']),
|
vcpu=int(specs['cpu']),
|
||||||
cpu=0.1 * int(specs['cpu']),
|
cpu=0.1 * int(specs['cpu']),
|
||||||
memory=1024 * int(specs['memory']),
|
memory=(512 if specs['memory'] == 0.5 else
|
||||||
|
1024 * int(specs['memory'])),
|
||||||
)
|
)
|
||||||
vm_specs += """<DISK>
|
vm_specs += """<DISK>
|
||||||
<TYPE>fs</TYPE>
|
<TYPE>fs</TYPE>
|
||||||
|
@ -269,8 +269,8 @@ class OpenNebulaManager():
|
||||||
vm_specs = vm_specs_formatter.format(
|
vm_specs = vm_specs_formatter.format(
|
||||||
vcpu=int(specs['cpu']),
|
vcpu=int(specs['cpu']),
|
||||||
cpu=0.1 * int(specs['cpu']),
|
cpu=0.1 * int(specs['cpu']),
|
||||||
memory=1024 * int(specs['memory']),
|
memory=(512 if specs['memory'] == 0.5 else
|
||||||
|
1024 * int(specs['memory'])),
|
||||||
)
|
)
|
||||||
vm_specs += """<DISK>
|
vm_specs += """<DISK>
|
||||||
<TYPE>fs</TYPE>
|
<TYPE>fs</TYPE>
|
||||||
|
|
Loading…
Reference in a new issue