phase in notion of a product

This commit is contained in:
Nico Schottelius 2020-02-09 09:36:50 +01:00
parent 55a2de72c8
commit 3b508fc87d
3 changed files with 100 additions and 4 deletions

View file

@ -55,6 +55,8 @@ def authenticate(username, password, totp_token=None):
server = ldap3.Server("ldaps://ldap1.ungleich.ch") server = ldap3.Server("ldaps://ldap1.ungleich.ch")
dn = "uid={},ou=customer,dc=ungleich,dc=ch".format(username) dn = "uid={},ou=customer,dc=ungleich,dc=ch".format(username)
log.debug("LDAP: connecting to {} as {}".format(server, dn))
try: try:
conn = ldap3.Connection(server, dn, password, auto_bind=True) conn = ldap3.Connection(server, dn, password, auto_bind=True)
except ldap3.core.exceptions.LDAPBindError as e: except ldap3.core.exceptions.LDAPBindError as e:
@ -72,12 +74,12 @@ def order(config):
if not config.arguments[required_arg]: if not config.arguments[required_arg]:
raise UncloudException("Missing required argument: {}".format(required_arg)) raise UncloudException("Missing required argument: {}".format(required_arg))
print(config.arguments) log.debug(config.arguments)
authenticate(config.arguments['username'], config.arguments['password']) authenticate(config.arguments['username'], config.arguments['password'])
# create DB entry for VM # create DB entry for VM
vm = VM(config) vm = VM(config)
vm.schedule() vm.product.place_order()

80
uncloud/hack/product.py Executable file
View file

@ -0,0 +1,80 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# 2020 Nico Schottelius (nico.schottelius at ungleich.ch)
#
# This file is part of uncloud.
#
# uncloud is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# uncloud is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with uncloud. If not, see <http://www.gnu.org/licenses/>.
import json
import uuid
from uncloud import UncloudException
from uncloud.hack.db import DB
# states
class Product(object):
def __init__(self, config, product_name, db_entry=None):
self.config = config
self.db = DB(self.config, prefix="/orders")
self.db_entry = {}
self.db_entry["product_name"] = product_name
self.db_entry["db_version"] = 1
# Existing product? Read in db_entry
if db_entry:
self.db_entry = db_entry
@staticmethod
def define_feature(self,
name,
feature,
one_time_price,
recurring_price,
recurring_period,
minimum_period):
feature = {}
feature[name] = {}
def valid_status(self):
if "status" in self.db_entry:
if self.db_entry["status"] in [ "NEW", "CREATED", "DELETED" ]:
return False
return True
def validate_product(self):
if not "uuid" in self.db_entry:
self.db_entry["uuid"] = str(uuid.uuid4())
if not "status" in self.db_entry:
self.db_entry["status"] = "NEW"
def place_order(self):
""" Schedule creating the product in etcd """
self.validate_product()
# FIXME: very status
if not self.db_entry["status"] == "NEW":
raise UncloudException("Cannot re-order product")
def __str__(self):
return self.features

View file

@ -41,6 +41,7 @@ import logging
from uncloud.hack.db import DB from uncloud.hack.db import DB
from uncloud.hack.mac import MAC from uncloud.hack.mac import MAC
from uncloud.vmm import VMM from uncloud.vmm import VMM
from uncloud.hack.product import Product
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
log.setLevel(logging.DEBUG) log.setLevel(logging.DEBUG)
@ -71,11 +72,15 @@ class VM(object):
self.image_format='qcow2' self.image_format='qcow2'
# External components. # External components.
self.vmm = VMM(vmm_backend=self.hackprefix)
# This one is broken:
# TypeError: expected str, bytes or os.PathLike object, not NoneType
# Fix before re-enabling
# self.vmm = VMM(vmm_backend=self.hackprefix)
self.mac = MAC(self.config) self.mac = MAC(self.config)
# Harcoded & generated values. # Harcoded & generated values.
self.owner = 'uncoud' self.owner = 'uncloud'
self.accel = 'kvm' self.accel = 'kvm'
self.threads = 1 self.threads = 1
self.ifup = os.path.join(self.hackprefix, "ifup.sh") self.ifup = os.path.join(self.hackprefix, "ifup.sh")
@ -84,6 +89,12 @@ class VM(object):
self.vm = {} self.vm = {}
self.product = Product(config, product_name="dualstack-vm")
self.features = []
# self.features.append(self.define_feature(
# self.super().__init__(
def get_qemu_args(self): def get_qemu_args(self):
command = ( command = (
"-name {owner}-{name}" "-name {owner}-{name}"
@ -104,6 +115,9 @@ class VM(object):
return command.split(" ") return command.split(" ")
def create_db_entry(self):
pass
def create(self): def create(self):
# New VM: new UUID, new MAC. # New VM: new UUID, new MAC.
self.uuid = str(uuid.uuid4()) self.uuid = str(uuid.uuid4())