Ejemplo n.º 1
0
    def map_sync_inputs(self, controller_image):
        swarm_manager_url = controller_image.controller.auth_url
        (swarm_manager_address,
         docker_registry_port) = swarm_manager_url.split(':')
        slog.info("swarm_manager_address: %s    docker_registry_port: %s" %
                  (swarm_manager_address, docker_registry_port))

        input_fields = {
            'swarm_manager_address':
            swarm_manager_address,
            'docker_registry_port':
            docker_registry_port,
            'image_file_path':
            controller_image.image.path,
            'image_dir':
            os.path.dirname(controller_image.image.path),
            'image_name':
            controller_image.image.name,
            'image_tag':
            controller_image.image.tag,
            'delete':
            False,
            'ansible_tag':
            '%s@%s' %
            (controller_image.image.name, controller_image.controller.name
             )  # name of ansible playbook
        }
        slog.info("input_fields: %s" % str(input_fields))

        return input_fields
Ejemplo n.º 2
0
    def map_delete_inputs(self, controller_network):
        # make sure to not delete a shared network
        """
        if (controller_network.network.template.shared_network_name or controller_network.network.template.shared_network_id):
            return
        """
        swarm_manager_url = controller_network.controller.auth_url
        (swarm_manager_address,
         docker_registry_port) = swarm_manager_url.split(':')
        slog.info("swarm_manager_address: %s    docker_registry_port: %s" %
                  (swarm_manager_address, docker_registry_port))

        try:
            slice = controller_network.network.owner
        except:
            raise Exception('Could not get slice for Network %s' %
                            controller_network.network.name)

        network_name = controller_network.network.name
        #subnet_name = '%s-%d'%(network_name,controller_network.pk)
        cidr = controller_network.subnet
        network_fields = {
            'swarm_manager_address':
            swarm_manager_address,
            'network_name':
            network_name,
            'ansible_tag':
            '%s-%s@%s' % (network_name, slice.slicename,
                          controller_network.controller.name),
            'delete':
            True
        }

        return network_fields
Ejemplo n.º 3
0
    def chk_svc_exist(self, instance, swarm_manager_address):
        duplicated_flag = False
        try:
            instance_name = '%s-%s-%d' % (instance.slice.service.name,
                                          instance.slice.name, instance.id)
            slog.debug("Service name to chkeck: %s" % instance_name)

            import docker
            docker_api_base_url = "tcp://%s:4243" % swarm_manager_address
            slog.debug("Docker API Base URL: %s" % docker_api_base_url)
            my_client = docker.DockerClient(base_url=docker_api_base_url)
            swarm_svc = my_client.services.get(instance_name)

            slog.debug("swarm_svc.id     : %s" % swarm_svc.id)
            slog.debug("swarm_svc.name   : %s" % swarm_svc.name)
            slog.debug("swarm_svc.attrs  : %s" % swarm_svc.attrs)
        except Exception as ex:
            slog.error("Exception: %s   %s   %s" %
                       (type(ex), str(ex), ex.args))
            slog.error("%s" % str(traceback.format_exc()))
            slog.info(
                "There is no duplicated service name, I would create new service (%s)"
                % instance_name)
            duplicated_flag = False
        else:
            slog.info("There is duplicated service name (%s)" % instance_name)
            duplicated_flag = True
        return duplicated_flag
 def delete_record(self, controller_slice_privilege):
     controller_register = json.loads(
         controller_slice_privilege.controller.backend_register)
     slog.info("controller_register: %s" % controller_register)
     if (controller_register.get('disabled', False)):
         raise InnocuousException(
             'Controller %s is disabled' %
             controller_slice_privilege.controller.name)
 def map_sync_outputs(self, controller_site_privilege, res):
     # results is an array in which each element corresponds to an 
     # "ok" string received per operation. If we get as many oks as
     # the number of operations we issued, that means a grand success.
     # Otherwise, the number of oks tell us which operation failed.
     slog.info("res: %s" % res) 
     controller_site_privilege.role_id = res[0]['id']
     controller_site_privilege.save()
Ejemplo n.º 6
0
 def alloc_gateway(self, subnet):
     # given a CIDR, allocate a default gateway using the .1 address within the subnet.
     #    10.123.0.0/24 --> 10.123.0.1
     #    207.141.192.128/28 --> 207.141.192.129
     (network, bits) = subnet.split("/")
     network = network.strip()
     bits = int(bits.strip())
     netmask = (~(pow(2, 32 - bits) - 1) & 0xFFFFFFFF)
     ip = struct.unpack("!L", socket.inet_aton(network))[0]
     ip = ip & netmask | 1
     slog.info("subnet: %s    gateway: %s" % (subnet, ip))
     return socket.inet_ntoa(struct.pack("!L", ip))
Ejemplo n.º 7
0
    def map_sync_inputs(self, controller_user):
        slog.debug("controller user: %r" % controller_user)
        if not controller_user.controller.admin_user:
            slog.info("controller %r has no admin_user, skipping" %
                      controller_user.controller)
            return

        # All users will have at least the 'user' role at their home site/tenant.
        # We must also check if the user should have the admin role

        roles = ['user']

        # setup user home site roles at controller
        if not controller_user.user.site:
            raise Exception('Siteless user %s' % controller_user.user.email)
        else:
            swarm_manager_url = controller_user.controller.auth_url
            slog.info("swarm_manager_url: %s" % swarm_manager_url)
            (swarm_manager_address,
             docker_registry_port) = swarm_manager_url.split(':')
            slog.info("swarm_manager_address: %s    docker_registry_port: %s" %
                      (swarm_manager_address, docker_registry_port))

            user_fields = {
                'swarm_manager_address':
                swarm_manager_address,
                'admin_user':
                controller_user.controller.admin_user,
                'ansible_tag':
                '%s@%s' %
                (controller_user.user.email.replace('@', '-at-'),
                 controller_user.controller.name)  # name of ansible playbook
            }
        slog.info("user_fields: %s" % user_fields)
        return user_fields
Ejemplo n.º 8
0
 def sync_record(self, role):
     slog.info("role: %r" % role)
     slog.info("role.enacted: %s" % role.enacted)
     if not role.enacted:
         controllers = Controller.objects.all()
         slog.info("controllers: %s" % controllers)
         for controller in controllers:
             slog.info("controller: %s" % controller)
         role.save()
Ejemplo n.º 9
0
    def map_delete_inputs(self, instance):
        try:
            controller_register = json.loads(
                instance.node.site_deployment.controller.backend_register)
            slog.debug("controller_register: %s" % controller_register)

            if (controller_register.get('disabled', False)):
                slog.info('Controller %s is disabled' %
                          instance.node.site_deployment.controller.name)
                raise InnocuousException(
                    'Controller %s is disabled' %
                    instance.node.site_deployment.controller.name)

            instance_name = '%s-%s-%d' % (instance.slice.service.name,
                                          instance.slice.name, instance.id)
            slog.debug("instance_name: %s" % instance_name)

            controller = instance.node.site_deployment.controller
            slog.debug("controller: %s" % controller)
            swarm_manager_url = controller.auth_url
            slog.debug("swarm_manager_url: %s" % swarm_manager_url)
            (swarm_manager_address,
             docker_registry_port) = swarm_manager_url.split(':')
            slog.debug(
                "swarm_manager_address: %s    docker_registry_port: %s" %
                (swarm_manager_address, docker_registry_port))
            host_volume_path = "/opt/xos/instance_volume/%s" % instance.id
            slog.debug("host_volume_path: %s" % host_volume_path)

            input = {
                'swarm_manager_address': swarm_manager_address,
                'swarm_service_name': instance_name,
                'host_volume_path': host_volume_path,
                'ansible_tag': instance_name,
                'delete': True
            }
            return input
        except Exception as ex:
            slog.error("Exception: %s   %s   %s" %
                       (type(ex), str(ex), ex.args))
            slog.error("%s" % str(traceback.format_exc()))
Ejemplo n.º 10
0
 def fetch_pending(self, deletion=False):
     slog.info("begin fetch_pending(%s)" % deletion)
     objs = super(SyncInstances, self).fetch_pending(deletion)
     slog.info("objs: %s" % objs)
     objs = [x for x in objs if x.isolation == "vm"]
     slog.info("vm objs: %s" % objs)
     return objs
Ejemplo n.º 11
0
    def map_sync_inputs(self, controller_network):
        # make sure to not sync a shared network
        slog.debug("controller_network: %s" % str(controller_network))
        slog.debug("controller_network.subnet: %s" % controller_network.subnet)
        slog.debug("controller_network.network_id: %s" %
                   controller_network.network_id)
        slog.debug("controller_network.network.name: %s" %
                   controller_network.network.name)

        slog.debug(
            "controller_network.network.template.shared_network_name: %s" %
            controller_network.network.template.shared_network_name)
        slog.debug(
            "controller_network.network.template.shared_network_id  : %s" %
            controller_network.network.template.shared_network_id)

        # If shared_network_name is kuryr/libnetwork2:latest --> then, discard following if-statement.
        """
        if (controller_network.network.template.shared_network_name or controller_network.network.template.shared_network_id):
            if controller_network.network.template.shared_network_name.__contains__("kuryr"):
                slog.debug("This is kuryr network")
            else:
                slog.debug("SyncStep.SYNC_WITHOUT_RUNNING: %s" % str(SyncStep.SYNC_WITHOUT_RUNNING))
                return SyncStep.SYNC_WITHOUT_RUNNING
        """

        slog.debug("network owner: %s    creator: %s" %
                   (controller_network.network.owner,
                    controller_network.network.owner.creator))
        if controller_network.network.owner and controller_network.network.owner.creator:
            return self.save_controller_network(controller_network)
        else:
            slog.info("I could not create network controller information %s" %
                      controller_network)
            raise Exception('I could not create network controller %s' %
                            controller_network)
    def delete_record(self, controller_site_privilege):
        controller_register = json.loads(controller_site_privilege.controller.backend_register)
        slog.info("controller_register: %s" % controller_register)

        if (controller_register.get('disabled',False)):
            slog.info("Controller %s is disabled" % controller_site_privilege.controller.name) 
            raise InnocuousException('Controller %s is disabled'%controller_site_privilege.controller.name)

        slog.info("Nothing to do on Swarm cluster") 
        pass
Ejemplo n.º 13
0
    def fetch_pending(self, deleted=False):
        lobjs = super(SyncControllerSites, self).fetch_pending(deleted)
        slog.info("lobjs: %r" % lobjs)

        slog.info("deleted: %s" % deleted)
        if not deleted:
            # filter out objects with null controllers
            lobjs = [x for x in lobjs if x.controller]
            slog.info("lobjs: %r" % lobjs)

        return lobjs
Ejemplo n.º 14
0
    def map_delete_inputs(self, controller_slice):
        slog.info("controller_slice: %r" % controller_slice)
        controller_users = ControllerUser.objects.filter(
            user_id=controller_slice.slice.creator.id,
            controller_id=controller_slice.controller.id)
        slog.info(
            "controller_slice.slice.creator.id: %s   controller_slice.controller.id: %s"
            % (controller_slice.slice.creator.id,
               controller_slice.controller.id))

        if not controller_users:
            slog.info("slice createor %s has not accout at controller %s" %
                      (controller_slice.slice.creator,
                       controller_slice.controller.name))
            raise Exception(
                "slice createor %s has not accout at controller %s" %
                (controller_slice.slice.creator,
                 controller_slice.controller.name))
        else:
            controller_user = controller_users[0]

        swarm_manager_url = controller_slice.controller.auth_url
        (swarm_manager_address,
         docker_registry_port) = swarm_manager_url.split(':')
        tenant_fields = {
            'swarm_manager_address':
            swarm_manager_address,
            'admin_user':
            controller_slice.controller.admin_user,
            'ansible_tag':
            '%s@%s' %
            (controller_slice.slice.name, controller_slice.controller.name),
            'delete':
            True
        }
        slog.info("tenant_fields: %s" % tenant_fields)

        return tenant_fields
Ejemplo n.º 15
0
    def map_delete_inputs(self, controller_image):
        try:
            controller_register = json.loads(
                instance.node.site_deployment.controller.backend_register)
            slog.debug("controller_register: %s" % controller_register)

            if (controller_register.get('disabled', False)):
                slog.info('Controller %s is disabled' %
                          instance.node.site_deployment.controller.name)
                raise InnocuousException(
                    'Controller %s is disabled' %
                    instance.node.site_deployment.controller.name)

            swarm_manager_url = controller_image.controller.auth_url
            (swarm_manager_address,
             docker_registry_port) = swarm_manager_url.split(':')
            slog.info("swarm_manager_address: %s    docker_registry_port: %s" %
                      (swarm_manager_address, docker_registry_port))

            input_fields = {
                'swarm_manager_address':
                swarm_manager_address,
                'docker_registry_port':
                docker_registry_port,
                'image_file_path':
                controller_image.image.path,
                'image_dir':
                os.path.dirname(controller_image.image.path),
                'image_name':
                controller_image.image.name,
                'image_tag':
                controller_image.image.tag,
                'delete':
                True,
                'ansible_tag':
                '%s@%s' %
                (controller_image.image.name, controller_image.controller.name
                 )  # name of ansible playbook
            }
            slog.info("input_fields: %s" % str(input_fields))
            return input_fields
        except Exception as ex:
            slog.error("Exception: %s   %s   %s" %
                       (type(ex), str(ex), ex.args))
            slog.error("%s" % str(traceback.format_exc()))
Ejemplo n.º 16
0
    def update_instance_with_ssh(self, inst_id):
        try:
            import subprocess
            import shlex

            new_inst = Instance.objects.get(id=inst_id)

            controller = new_inst.node.site_deployment.controller
            swarm_manager_url = controller.auth_url
            (swarm_manager_address,
             docker_registry_port) = swarm_manager_url.split(':')
            slog.info("swarm_manager_address: %s    docker_registry_port: %s" %
                      (swarm_manager_address, docker_registry_port))
            volume_mount_opt = "--mount-add type=bind,src=/opt/xos/instance_volume/%s,dst=%s" % (
                new_inst.id, new_inst.volumes)

            ## DOCKER SERVICE UPDATE
            ssh_cmd = "ssh root@%s   docker service update  --force  %s  %s" % (
                swarm_manager_address, volume_mount_opt,
                new_inst.instance_name)
            slog.debug("SSH CMD: %s" % ssh_cmd)
            popen = subprocess.Popen(ssh_cmd,
                                     stdout=subprocess.PIPE,
                                     stderr=subprocess.PIPE,
                                     shell=True)
            (stdoutdata, stderrdata) = popen.communicate()
            slog.debug("popen result: %s    etc data: %s" %
                       (stdoutdata, stderrdata))

            ## DOCKER SERVICE STATUS
            ssh_cmd = "ssh root@%s  docker service ps %s" % (
                swarm_manager_address, new_inst.instance_name)
            slog.debug("SSH CMD: %s" % ssh_cmd)
            popen = subprocess.Popen(ssh_cmd,
                                     stdout=subprocess.PIPE,
                                     stderr=subprocess.PIPE,
                                     shell=True)
            (stdoutdata, stderrdata) = popen.communicate()
            slog.debug("popen result: %s    etc data: %s" %
                       (stdoutdata, stderrdata))
        except Exception as ex:
            slog.info("Exception: %s   %s   %s" % (type(ex), str(ex), ex.args))
            slog.info("%s" % str(traceback.format_exc()))
        return 0
Ejemplo n.º 17
0
    def chk_net_exist(self, controller_network, swarm_manager_address):
        duplicated_flag = False
        try:
            slog.debug("network_name to check: %s" %
                       controller_network.network.name)

            import docker
            docker_api_base_url = "tcp://%s:4243" % swarm_manager_address
            slog.info("Docker API Base URL: %s" % docker_api_base_url)
            my_client = docker.DockerClient(base_url=docker_api_base_url)
            net = my_client.networks.get(controller_network.network.name)
            slog.debug("network.id                  : %s" % net.id)
            slog.debug("network.name                : %s" % net.name)
            slog.debug("network.attrs[IPAM][Config] : %s" %
                       net.attrs['IPAM']['Config'])
            slog.debug("network.attrs               : %s" % net.attrs)
        except Exception as ex:
            slog.info("Exception: %s" % str(ex.args))
            slog.info("Exception: %s" % str(ex))
            duplicated_flag = False  # There is no same network.
        else:
            duplicated_flag = True  # There is same network.
        slog.debug("network duplicated_flag: %s" % duplicated_flag)
        return duplicated_flag
Ejemplo n.º 18
0
    def map_sync_inputs(self, controller_site):
        swarm_manager_url = controller_site.controller.auth_url
        slog.info("swarm_manager_url: %s" % swarm_manager_url)
        (swarm_manager_address,
         docker_registry_port) = swarm_manager_url.split(':')
        slog.info("swarm_manager_address: %s    docker_registry_port: %s" %
                  (swarm_manager_address, docker_registry_port))

        input_fields = {
            'swarm_manager_address':
            swarm_manager_address,
            'admin_user':
            controller_site.controller.admin_user,
            'ansible_tag':
            '%s@%s' %
            (controller_site.site.login_base,
             controller_site.controller.name),  # name of ansible playbook
            'tenant_description':
            controller_site.site.name
        }

        slog.info("input_fields: %s" % input_fields)

        return input_fields
Ejemplo n.º 19
0
    def map_sync_outputs(self, instance, res):
        try:
            slog.info("ansible playbook ressult: %s" % str(res))
            slog.info("ansible playbook ressult[3][stdout]: %s" %
                      str(res[3]['stdout']))

            res_stdout = res[3]['stdout']
            json_content = json.loads(res_stdout)
            slog.info("json_content: %s" % str(json_content))
            instance.instance_id = json_content[0]['Spec']["Name"]
            slog.info("instance.instance_id: %s" % str(instance.instance_id))
            instance.instance_uuid = json_content[0]['ID']
            slog.info("instance.instance_uuid: %s" %
                      str(instance.instance_uuid))

            controller = instance.node.site_deployment.controller
            swarm_manager_url = controller.auth_url
            (swarm_manager_address,
             docker_registry_port) = swarm_manager_url.split(':')
            slog.info("swarm_manager_address: %s    docker_registry_port: %s" %
                      (swarm_manager_address, docker_registry_port))

            try:
                instance.ip = socket.gethostbyname(swarm_manager_address)
            except Exception, e:
                slog.info(str(e))
                slog.info("hostname(%s) resolution fail" %
                          swarm_manager_address)
                pass

            instance.instance_name = self.instance_name
            instance.save()
Ejemplo n.º 20
0
 def delete_record(self, controller_user):
     slog.info("Nothing to delete (%r)" % controller_user)
     pass
Ejemplo n.º 21
0
 def sync_record(self, role):
     slog.info("SyncImages:: role: %r" % role)
     # nothing to do
     pass
    def map_sync_inputs(self, controller_site_privilege):
        slog.info("begin map_sync_input()") 
        controller_register = json.loads(controller_site_privilege.controller.backend_register)
        if not controller_site_privilege.controller.admin_user:
            slog.info("controller %r has no admin_user, skipping" % controller_site_privilege.controller)
            return

        roles = [controller_site_privilege.site_privilege.role.role]
        slog.info("roles: %s" % roles) 
        # setup user home site roles at controller 
        if not controller_site_privilege.site_privilege.user.site:
            slog.info("Siteless user %s" % controller_site_privilege.site_privilege.user.email)
            raise Exception('Siteless user %s'%controller_site_privilege.site_privilege.user.email)
        else:
            swarm_manager_url = controller_site_privilege.controller.auth_url
            slog.info("swarm_manager_url: %s" % swarm_manager_url)
            (swarm_manager_address, docker_registry_port) = swarm_manager_url.split(':')
            slog.info("swarm_manager_address: %s    docker_registry_port: %s" % (
                        swarm_manager_address, 
                        docker_registry_port)) 

            user_fields = {
                            'swarm_manager_address' : swarm_manager_address, 
                            'name': controller_site_privilege.site_privilege.user.email,
                            'admin_user': controller_site_privilege.controller.admin_user,
                            'ansible_tag':'%s@%s' % (
                                            controller_site_privilege.site_privilege.user.email.replace('@','-at-'),
                                            controller_site_privilege.controller.name)
                            } 
        slog.info("user_fields: %s" % user_fields)

        return user_fields
Ejemplo n.º 23
0
    def map_sync_inputs(self, controller_slice):
        slog.info("sync'ing slice controller %s" % controller_slice)

        if not controller_slice.controller.admin_user:
            slog.info("controller %r has no admin_user, skipping" %
                      controller_slice.controller)
            return

        slog.info(
            "controller_slice.slice.creator.id: %s    controller_slice.controller.id: %s"
            % (controller_slice.slice.creator.id,
               controller_slice.controller.id))
        controller_users = ControllerUser.objects.filter(
            user_id=controller_slice.slice.creator.id,
            controller_id=controller_slice.controller.id)
        if not controller_users:
            slog.info("slice createor %s has not accout at controller %s" %
                      (controller_slice.slice.creator,
                       controller_slice.controller.name))
            raise Exception(
                "slice createor %s has not accout at controller %s" %
                (controller_slice.slice.creator,
                 controller_slice.controller.name))
        else:
            controller_user = controller_users[0]

        max_instances = int(controller_slice.slice.max_instances)
        slog.info("controller_slice.slice.max_instances: %s" %
                  controller_slice.slice.max_instances)

        swarm_manager_url = controller_slice.controller.auth_url
        (swarm_manager_address,
         docker_registry_port) = swarm_manager_url.split(':')
        slog.info("swarm_manager_address: %s    docker_registry_port: %s" %
                  (swarm_manager_address, docker_registry_port))

        tenant_fields = {
            'swarm_manager_address':
            swarm_manager_address,
            'admin_user':
            controller_slice.controller.admin_user,
            'ansible_tag':
            '%s@%s' %
            (controller_slice.slice.name, controller_slice.controller.name)
        }
        slog.info("tenant_fields: %s" % tenant_fields)

        return tenant_fields
Ejemplo n.º 24
0
    def map_sync_inputs(self, instance):
        try:
            slog.debug("instance: %s    slice: %s" %
                       (instance, instance.slice.name))

            controller = instance.node.site_deployment.controller
            swarm_manager_url = controller.auth_url
            slog.info("swarm_manager_url: %s" % swarm_manager_url)
            (swarm_manager_address,
             docker_registry_port) = swarm_manager_url.split(':')
            slog.info("swarm_manager_address: %s    docker_registry_port: %s" %
                      (swarm_manager_address, docker_registry_port))

            ## if instance.instance_uuid is not None,
            ## then This method will update the instance with new configuration.
            swarm_service_update_flag = False
            if instance.instance_uuid is not None:
                if len(instance.instance_uuid) > 2:
                    swarm_service_update_flag = True

            # check if this service is created already on swarm cluster.
            duplicated_flag = self.chk_svc_exist(instance,
                                                 swarm_manager_address)
            if duplicated_flag is True:
                swarm_service_update_flag = True

            ## To get volume information
            slog.debug("slice.mount_data_sets: %s" %
                       instance.slice.mount_data_sets)
            mount_dest_path = "/usr/local/etc"
            if len(instance.slice.mount_data_sets) < 2:
                slog.debug("instance.slice.mount_data_sets(%s) is too short" %
                           instance.slice.mount_data_sets)
            else:
                mount_dest_path = instance.slice.mount_data_sets
            slog.debug("volume mount destination path: %s" % mount_dest_path)

            ## set options for volume mounting
            ## (example) --mount type=bind,src=/opt/xos/instance_volume/1,dst=/usr/local/etc/haproxy
            volume_mount_opt = " "
            if swarm_service_update_flag is True:
                volume_mount_opt = "--mount-add type=bind,src=/opt/xos/instance_volume/%s,dst=%s" % (
                    instance.id, mount_dest_path)
            else:
                volume_mount_opt = "--mount type=bind,src=/opt/xos/instance_volume/%s,dst=%s" % (
                    instance.id, mount_dest_path)
            slog.debug("volume_mount_opt: %s" % volume_mount_opt)
            host_volume_path = "/opt/xos/instance_volume/%s" % instance.id
            slog.debug("host_volume_path: %s" % host_volume_path)

            # sanity check - make sure model_policy for slice has run
            if ((not instance.slice.policed)
                    or (instance.slice.policed < instance.slice.updated)):
                slog.info(
                    "Instance %s waiting on Slice %s to execute model policies"
                    % (instance, instance.slice.name))
                raise DeferredException(
                    "Instance %s waiting on Slice %s to execute model policies"
                    % (instance, instance.slice.name))

            # sanity check - make sure model_policy for all slice networks have run
            networks = instance.slice.ownedNetworks.all()
            slog.debug("network list for slice of this instance(%s): %s" %
                       (instance.name, str(networks)))

            for network in instance.slice.ownedNetworks.all():
                slog.info("instance: %s   network of slice(%s): %s" %
                          (instance.name, instance.slice.name, network.name))
                if ((not network.policed)
                        or (network.policed < network.updated)):
                    slog.info(
                        "Instance %s waiting on Network %s to execute model policies"
                        % (instance, network.name))
                    raise DeferredException(
                        "Instance %s waiting on Network %s to execute model policies"
                        % (instance, network.name))
            slog.debug("Model Policy checking is done successfully.")

            swarm_network = ""
            for network in networks:
                slog.debug("networkd.id: %s(%s, %s)  controller.id: %s" %
                           (network.id, network.name, network.subnet,
                            instance.node.site_deployment.controller.id))
                if not ControllerNetwork.objects.filter(
                        network_id=network.id,
                        controller_id=instance.node.site_deployment.controller.
                        id).exists():
                    raise DeferredException(
                        "Instance %s Private Network %s lacks ControllerNetwork object"
                        % (instance, network.name))
                swarm_network += " --network %s " % network.name
            slog.debug("swarm_network: %s" % swarm_network)

            image_name = None
            controller_images = instance.image.controllerimages.all()
            controller_images = [
                x for x in controller_images if x.controller_id ==
                instance.node.site_deployment.controller.id
            ]
            if controller_images:
                image_name = controller_images[0].image.name
                slog.info("using image from ControllerImage object: " +
                          str(image_name))

            host_filter = instance.node.name.strip()
            slog.info("instance.node.name: %s" % instance.node.name)

            instance_name = '%s-%s-%d' % (instance.slice.service.name,
                                          instance.slice.name, instance.id)
            slog.info(
                "service name: %s   instance.slice.name: %s    instance.id: %s    instance_name: %s"
                % (instance.slice.service.name, instance.slice.name,
                   instance.id, instance_name))
            self.instance_name = instance_name

            input_fields = {
                'swarm_manager_address': swarm_manager_address,
                'swarm_service_name': instance_name,
                'network_name': swarm_network,
                'replicas': "--replicas 1",
                'restart_condition':
                "--restart-condition any  --restart-delay 9s ",
                'volume': volume_mount_opt,
                'host_volume_path': host_volume_path,
                'docker_registry_port': docker_registry_port,
                'image_name': instance.image.name,
                'image_tag': instance.image.tag,
                'ansible_tag': instance_name,
                'delete': False,
                'update': swarm_service_update_flag
            }

            slog.info("input_fields: %s" % input_fields)

            if swarm_service_update_flag is False:
                slog.info(
                    "swarm_service_update_flag is %s, so I will update once more"
                    % swarm_service_update_flag)
                try:
                    my_thr = threading.Thread(target=self.update_instance,
                                              args=(instance, ))
                    my_thr.start()
                except Exception as ex:
                    slog.error("Exception: %s   %s   %s" %
                               (type(ex), str(ex), ex.args))
                    slog.error("%s" % str(traceback.format_exc()))
            return input_fields
        except Exception as ex:
            slog.error("Exception: %s   %s   %s" %
                       (type(ex), str(ex), ex.args))
            slog.error("%s" % str(traceback.format_exc()))
    def map_sync_inputs(self, controller_slice_privilege):
        slog.info("controller_slice_privilege: %r" %
                  controller_slice_privilege)
        if not controller_slice_privilege.controller.admin_user:
            slog.info("controller %r has no admin_user, skipping" %
                      controller_slice_privilege.controller)
            return

        template = os_template_env.get_template('sync_controller_users.yaml')
        slog.info("sync_controller_users.yaml --> template: %s" % template)
        roles = [controller_slice_privilege.slice_privilege.role.role]
        # setup user home slice roles at controller
        if not controller_slice_privilege.slice_privilege.user.site:
            slog.info('Sliceless user %s' %
                      controller_slice_privilege.slice_privilege.user.email)
            raise Exception(
                'Sliceless user %s' %
                controller_slice_privilege.slice_privilege.user.email)
        else:
            swarm_manager_url = controller_slice_privilege.controller.auth_url
            slog.info("swarm_manager_url: %s" % swarm_manager_url)
            (swarm_manager_address,
             docker_registry_port) = swarm_manager_url.split(':')
            slog.info("swarm_manager_address: %s    docker_registry_port: %s" %
                      (swarm_manager_address, docker_registry_port))

            user_fields = {
                'swarm_manager_address':
                swarm_manager_address,
                'admin_user':
                controller_slice_privilege.controller.admin_user,
                'ansible_tag':
                '%s@%s@%s' %
                (controller_slice_privilege.slice_privilege.user.email.replace(
                    '@', '-at-'),
                 controller_slice_privilege.slice_privilege.slice.name,
                 controller_slice_privilege.controller.name)
            }

            slog.info("user_fields: %s" % user_fields)

            return user_fields
Ejemplo n.º 26
0
    def update_instance(self, instance):
        slog.info(
            "[THREAD] instance_name: %s   Thread: %s    instance.updated: %s" %
            (instance.instance_name, threading.current_thread().name,
             instance.updated))
        time.sleep(10)

        try:
            inst_id = instance.id
            slog.debug("[THREAD] inst_id          : %s" % inst_id)
            old_update = 0

            for idx in range(1, 100, 1):
                slog.debug("[THREAD] idx: %s" % idx)
                new_inst = Instance.objects.get(id=inst_id)

                if old_update == 0:
                    old_update = new_inst.updated
                slog.debug("[THREAD] updated(old)     : %s" % time.strftime(
                    "%Y-%m-%d %H:%M:%S", time.gmtime(old_update)))

                if (new_inst.volumes is not None) and (new_inst.instance_name
                                                       is not None):
                    if (len(new_inst.volumes) > 2) and (len(
                            new_inst.instance_name) > 2):
                        slog.debug("[THREAD] instance_name    : %s  (%s)" %
                                   (new_inst.instance_name,
                                    len(new_inst.instance_name)))
                        slog.debug("[THREAD] volumes          : %s  (%s)" %
                                   (new_inst.volumes, len(new_inst.volumes)))
                        """ 
                        if idx == 1:
                            self.update_instance_with_ssh(inst_id)
                        """

                        new_inst.numberCores = idx
                        new_inst.updated = time.time()
                        slog.debug(
                            "[THREAD] updated to renew : %s (%s)" %
                            (time.strftime("%Y-%m-%d %H:%M:%S",
                                           time.gmtime(new_inst.updated)),
                             new_inst.updated))
                        new_inst.save(update_fields=['updated', 'numberCores'])

                        time.sleep(1)

                        clone_inst = Instance.objects.get(id=inst_id)
                        clone_inst.save(update_fields=['numberCores'])
                        slog.debug(
                            "[THREAD] updated          : %s (%s)" %
                            (time.strftime("%Y-%m-%d %H:%M:%S",
                                           time.gmtime(clone_inst.updated)),
                             clone_inst.updated))
                        if clone_inst.updated == old_update:
                            slog.debug(
                                "[THREAD] updated date was not changed. Nothing is executed. Waiting 5 seconds."
                            )
                            time.sleep(5)
                        else:
                            slog.debug(
                                "[THREAD] updated date was changed. Swarm synchronizer will run ansible"
                            )
                            return
        except Exception as ex:
            slog.error("Exception: %s   %s   %s" %
                       (type(ex), str(ex), ex.args))
            slog.error("%s" % str(traceback.format_exc()))
Ejemplo n.º 27
0
    def save_controller_network(self, controller_network):
        network_name = controller_network.network.name
        #subnet_name = '%s-%d'%(network_name, controller_network.pk)
        #slog.info("network_name: %s    subnet_name: %s" % (network_name, subnet_name))
        if controller_network.subnet and controller_network.subnet.strip():
            # If a subnet is already specified (pass in by the creator), then
            # use that rather than auto-generating one.
            cidr = controller_network.subnet.strip()
            slog.info("subnet CIDR_MS : %s" % cidr)
        else:
            cidr = self.alloc_subnet(controller_network.pk)
            slog.info("subnet CIDR_AMS: %s" % cidr)

        if controller_network.network.start_ip and controller_network.network.start_ip.strip(
        ):
            start_ip = controller_network.network.start_ip.strip()
            # FIXME: this assignment(gateway=start_ip) is temporary code.
            #        I would add a attribute gateway on core_network model.
            controller_network.gateway = start_ip
        else:
            start_ip = None
            controller_network.gateway = self.alloc_gateway(cidr)

        if controller_network.network.end_ip and controller_network.network.end_ip.strip(
        ):
            end_ip = controller_network.network.end_ip.strip()
        else:
            end_ip = None
        slog.info("Start IP Address: %s    End IP Address: %s" %
                  (start_ip, end_ip))

        self.cidr = cidr
        slice = controller_network.network.owner

        opt_driver = "--driver=overlay"  # default driver for swarm
        opt_ipam_driver = " "
        opt_ipam_neutron_opt = " "
        if controller_network.network.template.shared_network_name is not None:
            if controller_network.network.template.shared_network_name.__contains__(
                    "kuryr"):
                opt_driver = "--driver=%s" % controller_network.network.template.shared_network_name
                opt_ipam_driver = "--ipam-driver=%s" % controller_network.network.template.shared_network_name
                opt_ipam_neutron_opt = "--ipam-opt=neutron.pool.uuid=%s  -o neutron.pool.uuid=%s  -o neutron.net.name=%s" % (
                    controller_network.network.labels,
                    controller_network.network.labels,
                    controller_network.network.name)

        swarm_manager_url = controller_network.controller.auth_url
        (swarm_manager_address,
         docker_registry_port) = swarm_manager_url.split(':')
        slog.info("swarm_manager_address: %s    docker_registry_port: %s" %
                  (swarm_manager_address, docker_registry_port))

        # check if this controller network is created already on swarm cluster.
        duplicated_flag = self.chk_net_exist(controller_network,
                                             swarm_manager_address)

        network_fields = {
            'swarm_manager_address':
            swarm_manager_address,
            'network_name':
            network_name,
            #'subnet_name': subnet_name,
            'ansible_tag':
            '%s-%s@%s' % (network_name, slice.slicename,
                          controller_network.controller.name),
            'opt_driver':
            opt_driver,
            'opt_ipam_driver':
            opt_ipam_driver,
            'opt_ipam_neutron_opt':
            opt_ipam_neutron_opt,
            'opt_subnet':
            "--subnet=%s" % cidr,
            'opt_gateway':
            "--gateway=%s" % controller_network.gateway,
            'start_ip':
            start_ip,
            'end_ip':
            end_ip,
            'duplicated':
            duplicated_flag,
            'delete':
            False
        }
        slog.info("network_fields: %s" % network_fields)

        return network_fields
 def map_sync_outputs(self, controller_slice_privilege, res):
     slog.info("res: %s" % res)
     controller_slice_privilege.role_id = res[0]['id']
     controller_slice_privilege.save()