def get_cluster_config(self, cluster_name, headers):
     result = {}
     self._connect_tenant(headers)
     clusters = load_from_metadata(self.client_tenant, name=cluster_name)
     if len(clusters) != 1:
         raise CseServerError('Cluster \'%s\' not found' % cluster_name)
     vapp = VApp(self.client_tenant, href=clusters[0]['vapp_href'])
     template = self.get_template(name=clusters[0]['template'])
     result['body'] = get_cluster_config(self.config, vapp,
                                         template['admin_password'])
     result['status_code'] = OK
     return result
Пример #2
0
    def get_node_info(self, cluster_name, node_name):
        """Get the info of a given node in the cluster.

        :param cluster_name: (str): Name of the cluster
        :param node_name: (str): Name of the node

        :return: (dict): Info of the node.
        """
        result = {}
        result['body'] = []
        result['status_code'] = OK
        self._connect_tenant()
        clusters = load_from_metadata(self.tenant_client, name=cluster_name)
        if len(clusters) == 0:
            raise CseServerError(f"Cluster \'{cluster_name}\' not found.")
        vapp = VApp(self.tenant_client, href=clusters[0]['vapp_href'])
        vms = vapp.get_all_vms()
        node_info = None
        for vm in vms:
            if (node_name == vm.get('name')):
                node_info = {
                    'name': vm.get('name'),
                    'numberOfCpus': '',
                    'memoryMB': '',
                    'status': VCLOUD_STATUS_MAP.get(int(vm.get('status'))),
                    'ipAddress': ''
                }
                if hasattr(vm, 'VmSpecSection'):
                    node_info['numberOfCpus'] = vm.VmSpecSection.NumCpus.text
                    node_info[
                        'memoryMB'] = \
                        vm.VmSpecSection.MemoryResourceMb.Configured.text
                try:
                    node_info['ipAddress'] = vapp.get_primary_ip(
                        vm.get('name'))
                except Exception:
                    LOGGER.debug(f"Unable to get ip address of node "
                                 f"{vm.get('name')}")
                if vm.get('name').startswith(TYPE_MASTER):
                    node_info['node_type'] = 'master'
                elif vm.get('name').startswith(TYPE_NODE):
                    node_info['node_type'] = 'node'
                elif vm.get('name').startswith(TYPE_NFS):
                    node_info['node_type'] = 'nfsd'
                    exports = self._get_nfs_exports(node_info['ipAddress'],
                                                    vapp, vm)
                    node_info['exports'] = exports
        if node_info is None:
            raise CseServerError(f"Node '{node_name}' not found in cluster "
                                 f"'{cluster_name}'")
        result['body'] = node_info
        return result
 def list_clusters(self):
     self._connect_tenant()
     clusters = []
     for c in load_from_metadata(self.tenant_client):
         clusters.append({
             'name': c['name'],
             'IP master': c['leader_endpoint'],
             'template': c['template'],
             'VMs': c['number_of_vms'],
             'vdc': c['vdc_name'],
             'status': c['status']
         })
     return clusters
 def cluster_rollback(self):
     """Implements rollback for cluster creation failure"""
     LOGGER.info('About to rollback cluster with name: %s' %
                 self.cluster_name)
     clusters = load_from_metadata(self.client_tenant,
                                   name=self.cluster_name)
     if len(clusters) != 1:
         LOGGER.debug('Cluster %s not found.' % self.cluster_name)
         return
     self.cluster = clusters[0]
     vdc = VDC(self.client_tenant, href=self.cluster['vdc_href'])
     vdc.delete_vapp(self.cluster['name'], force=True)
     LOGGER.info('Successfully deleted cluster: %s' % self.cluster_name)
 def cluster_rollback(self):
     """Rollback for cluster creation failure."""
     LOGGER.info(f"About to rollback cluster with name: "
                 "{self.cluster_name}")
     self._connect_tenant()
     clusters = load_from_metadata(
         self.tenant_client, name=self.cluster_name)
     if len(clusters) != 1:
         LOGGER.debug(f"Cluster {self.cluster_name} not found.")
         return
     self.cluster = clusters[0]
     vdc = VDC(self.tenant_client, href=self.cluster['vdc_href'])
     vdc.delete_vapp(self.cluster['name'], force=True)
     LOGGER.info(f"Successfully deleted cluster: {self.cluster_name}")
 def list_clusters(self, headers, body):
     result = {}
     try:
         result['body'] = []
         result['status_code'] = OK
         self._connect_tenant(headers)
         clusters = load_from_metadata(self.client_tenant)
         result['body'] = clusters
     except Exception:
         LOGGER.error(traceback.format_exc())
         result['body'] = []
         result['status_code'] = INTERNAL_SERVER_ERROR
         result['message'] = traceback.format_exc()
     return result
Пример #7
0
 def get_cluster_config(self, cluster_name, headers):
     result = {}
     try:
         self._connect_tenant(headers)
         clusters = load_from_metadata(self.client_tenant,
                                       name=cluster_name)
         if len(clusters) != 1:
             raise Exception('Cluster \'%s\' not found' % cluster_name)
         vapp = VApp(self.client_tenant, href=clusters[0]['vapp_href'])
         template = self.get_template(name=clusters[0]['template'])
         result['body'] = get_cluster_config(self.config, vapp,
                                             template['admin_password'])
         result['status_code'] = OK
     except Exception as e:
         result['body'] = str(e)
         result['status_code'] = INTERNAL_SERVER_ERROR
     return result
    def get_cluster_config(self, cluster_name):
        self._connect_tenant()
        clusters = load_from_metadata(
            self.tenant_client,
            name=cluster_name,
            org_name=self.req_spec.get(RequestKey.ORG_NAME),
            vdc_name=self.req_spec.get(RequestKey.OVDC_NAME))
        if len(clusters) > 1:
            raise CseDuplicateClusterError(f"Multiple clusters of name"
                                           f" '{cluster_name}' detected.")
        if len(clusters) == 0:
            raise ClusterNotFoundError(f"Cluster '{cluster_name}' not found.")

        vapp = VApp(self.tenant_client, href=clusters[0]['vapp_href'])
        template = self._get_template(name=clusters[0]['template'])
        server_config = get_server_runtime_config()
        result = get_cluster_config(server_config, vapp,
                                    template['admin_password'])
        return result
 def get_cluster_info(self, name, headers, body):
     result = {}
     try:
         result['body'] = []
         result['status_code'] = OK
         self._connect_tenant(headers)
         clusters = load_from_metadata(self.client_tenant, name=name)
         if len(clusters) == 0:
             raise Exception('Cluster \'%s\' not found.' % name)
         vapp = VApp(self.client_tenant, href=clusters[0]['vapp_href'])
         vms = vapp.get_all_vms()
         for vm in vms:
             node_info = {
                 'name': vm.get('name'),
                 'numberOfCpus': '',
                 'memoryMB': '',
                 'status': VCLOUD_STATUS_MAP.get(int(vm.get('status'))),
                 'ipAddress': ''
             }
             if hasattr(vm, 'VmSpecSection'):
                 node_info['numberOfCpus'] = vm.VmSpecSection.NumCpus.text
                 node_info[
                     'memoryMB'] = \
                     vm.VmSpecSection.MemoryResourceMb.Configured.text
             try:
                 node_info['ipAddress'] = vapp.get_primary_ip(
                     vm.get('name'))
             except Exception:
                 LOGGER.debug('cannot get ip address for node %s' %
                              vm.get('name'))
             if vm.get('name').startswith(TYPE_MASTER):
                 node_info['node_type'] = 'master'
                 clusters[0].get('master_nodes').append(node_info)
             elif vm.get('name').startswith(TYPE_NODE):
                 node_info['node_type'] = 'node'
                 clusters[0].get('nodes').append(node_info)
         result['body'] = clusters[0]
     except Exception as e:
         LOGGER.error(traceback.format_exc())
         result['body'] = []
         result['status_code'] = INTERNAL_SERVER_ERROR
         result['message'] = str(e)
     return result
 def list_clusters(self):
     self._connect_tenant()
     clusters = []
     raw_clusters = load_from_metadata(
         self.tenant_client,
         org_name=self.req_spec.get(RequestKey.ORG_NAME),
         vdc_name=self.req_spec.get(RequestKey.OVDC_NAME))
     for c in raw_clusters:
         clusters.append({
             'name': c['name'],
             'IP master': c['leader_endpoint'],
             'template': c['template'],
             'VMs': c['number_of_vms'],
             'vdc': c['vdc_name'],
             'status': c['status'],
             'vdc_id': c['vdc_id'],
             'org_name': get_org_name_from_ovdc_id(c['vdc_id']),
             K8S_PROVIDER_KEY: K8sProviders.NATIVE
         })
     return clusters
    def get_cluster_info(self, cluster_name):
        """Get the info of the cluster.

        :param cluster_name: (str): Name of the cluster

        :return: (dict): Info of the cluster.
        """
        self._connect_tenant()
        clusters = load_from_metadata(
            self.tenant_client,
            name=cluster_name,
            org_name=self.req_spec.get(RequestKey.ORG_NAME),
            vdc_name=self.req_spec.get(RequestKey.OVDC_NAME))
        if len(clusters) > 1:
            raise CseDuplicateClusterError(f"Multiple clusters of name"
                                           f" '{cluster_name}' detected.")
        if len(clusters) == 0:
            raise ClusterNotFoundError(f"Cluster '{cluster_name}' not found.")

        cluster = clusters[0]
        cluster[K8S_PROVIDER_KEY] = K8sProviders.NATIVE
        vapp = VApp(self.tenant_client, href=clusters[0]['vapp_href'])
        vms = vapp.get_all_vms()
        for vm in vms:
            node_info = {
                'name': vm.get('name'),
                'ipAddress': ''
            }
            try:
                node_info['ipAddress'] = vapp.get_primary_ip(
                    vm.get('name'))
            except Exception:
                LOGGER.debug(f"Unable to get ip address of node "
                             f"{vm.get('name')}")
            if vm.get('name').startswith(NodeType.MASTER):
                cluster.get('master_nodes').append(node_info)
            elif vm.get('name').startswith(NodeType.WORKER):
                cluster.get('nodes').append(node_info)
            elif vm.get('name').startswith(NodeType.NFS):
                cluster.get('nfs_nodes').append(node_info)
        return cluster
 def delete_nodes(self, headers, body):
     result = {'body': {}}
     self.cluster_name = body['name']
     LOGGER.debug('about to delete nodes from cluster with name: %s' %
                  body['name'])
     result['status_code'] = INTERNAL_SERVER_ERROR
     try:
         if len(body['nodes']) < 1:
             raise Exception('Invalid list of nodes: %s.' % body['nodes'])
         for node in body['nodes']:
             if node.startswith(TYPE_MASTER):
                 raise Exception('Can\'t delete a master node: \'%s\'.' %
                                 node)
         self.tenant_info = self._connect_tenant(headers)
         clusters = load_from_metadata(self.client_tenant,
                                       name=self.cluster_name)
         if len(clusters) != 1:
             raise Exception('Cluster \'%s\' not found.' %
                             self.cluster_name)
         self.cluster = clusters[0]
         self.headers = headers
         self.body = body
         self.op = OP_DELETE_NODES
         self._connect_sysadmin()
         self.cluster_id = self.cluster['cluster_id']
         self.update_task(
             TaskStatus.RUNNING,
             message='Deleting %s node(s) from cluster %s(%s)' %
             (len(body['nodes']), self.cluster_name, self.cluster_id))
         self.daemon = True
         self.start()
         response_body = {}
         response_body['cluster_name'] = self.cluster_name
         response_body['task_href'] = self.task_resource.get('href')
         result['body'] = response_body
         result['status_code'] = ACCEPTED
     except Exception as e:
         result['body'] = self._to_message(e)
         LOGGER.error(traceback.format_exc())
     return result
Пример #13
0
    def get_cluster_info(self, name, headers, body):
        """Get the info of the cluster.

        :param cluster_name: (str): Name of the cluster
        :param headers: (str): Request headers

        :return: (dict): Info of the cluster.
        """
        result = {}
        try:
            result['body'] = []
            result['status_code'] = OK
            self._connect_tenant(headers)
            clusters = load_from_metadata(self.client_tenant, name=name)
            if len(clusters) == 0:
                raise Exception('Cluster \'%s\' not found.' % name)
            vapp = VApp(self.client_tenant, href=clusters[0]['vapp_href'])
            vms = vapp.get_all_vms()
            for vm in vms:
                node_info = {'name': vm.get('name'), 'ipAddress': ''}
                try:
                    node_info['ipAddress'] = vapp.get_primary_ip(
                        vm.get('name'))
                except Exception:
                    LOGGER.debug('cannot get ip address for node %s' %
                                 vm.get('name'))
                if vm.get('name').startswith(TYPE_MASTER):
                    clusters[0].get('master_nodes').append(node_info)
                elif vm.get('name').startswith(TYPE_NODE):
                    clusters[0].get('nodes').append(node_info)
                elif vm.get('name').startswith(TYPE_NFS):
                    clusters[0].get('nfs_nodes').append(node_info)
            result['body'] = clusters[0]
        except Exception as e:
            LOGGER.error(traceback.format_exc())
            result['body'] = []
            result['status_code'] = INTERNAL_SERVER_ERROR
            result['message'] = str(e)
        return result
    def delete_nodes(self):
        result = {'body': {}}
        self.cluster_name = self.req_spec.get(RequestKey.CLUSTER_NAME)
        LOGGER.debug(f"About to delete nodes from cluster with name: "
                     f"{self.req_spec.get(RequestKey.CLUSTER_NAME)}")

        if len(self.req_spec.get(RequestKey.NODE_NAMES_LIST)) < 1:
            raise CseServerError(f"Invalid list of nodes: {self.req_spec.get(RequestKey.NODE_NAMES_LIST)}.") # noqa: E501
        for node in self.req_spec.get(RequestKey.NODE_NAMES_LIST):
            if node.startswith(NodeType.MASTER):
                raise CseServerError(f"Can't delete a master node: '{node}'.")
        self._connect_tenant()
        self._connect_sys_admin()
        clusters = load_from_metadata(
            self.tenant_client, name=self.cluster_name,
            org_name=self.req_spec.get(RequestKey.ORG_NAME),
            vdc_name=self.req_spec.get(RequestKey.OVDC_NAME))
        if len(clusters) <= 0:
            raise CseServerError(f"Cluster '{self.cluster_name}' not found.")

        if len(clusters) > 1:
            raise CseDuplicateClusterError(f"Multiple clusters of name "
                                           f"'{self.cluster_name}' detected.")
        self.cluster = clusters[0]
        self.op = OP_DELETE_NODES
        self.cluster_id = self.cluster['cluster_id']
        self._update_task(
            TaskStatus.RUNNING,
            message=f"Deleting "
                    f"{len(self.req_spec.get(RequestKey.NODE_NAMES_LIST))} "
                    f"node(s) from cluster "
                    f"{self.cluster_name}({self.cluster_id})")
        self.daemon = True
        self.start()
        result = {
            'cluster_name': self.cluster_name,
            'task_href': self.task_resource.get('href')
        }
        return result
    def create_nodes(self):
        self.cluster_name = self.req_spec.get(RequestKey.CLUSTER_NAME)
        LOGGER.debug(f"About to add "
                     f"{self.req_spec.get(RequestKey.NUM_WORKERS)} nodes to "
                     f"cluster {self.cluster_name} on VDC "
                     f"{self.req_spec.get(RequestKey.OVDC_NAME)}")
        if self.req_spec.get(RequestKey.NUM_WORKERS) < 1:
            raise CseServerError(f"Invalid node count: {self.req_spec.get(RequestKey.NUM_WORKERS)}.") # noqa: E501
        if self.req_spec.get(RequestKey.NETWORK_NAME) is None:
            raise CseServerError(f'Network name is missing from the request.')

        self._connect_tenant()
        self._connect_sys_admin()
        clusters = load_from_metadata(
            self.tenant_client, name=self.cluster_name,
            org_name=self.req_spec.get(RequestKey.ORG_NAME),
            vdc_name=self.req_spec.get(RequestKey.OVDC_NAME))

        if len(clusters) > 1:
            raise CseDuplicateClusterError(f"Multiple clusters of name "
                                           f"'{self.cluster_name}' detected.")
        if len(clusters) == 0:
            raise ClusterNotFoundError(
                f"Cluster '{self.cluster_name}' not found.")

        self.cluster = clusters[0]
        self.op = OP_CREATE_NODES
        self.cluster_id = self.cluster['cluster_id']
        self._update_task(
            TaskStatus.RUNNING,
            message=f"Adding {self.req_spec.get(RequestKey.NUM_WORKERS)} "
                    f"node(s) to cluster "
                    f"{self.cluster_name}({self.cluster_id})")
        self.daemon = True
        self.start()
        result = {}
        result['cluster_name'] = self.cluster_name
        result['task_href'] = self.task_resource.get('href')
        return result
Пример #16
0
    def delete_cluster(self, cluster_name):
        LOGGER.debug(f"About to delete cluster with name: {cluster_name}")

        self.cluster_name = cluster_name
        self._connect_tenant()
        self._connect_sys_admin()
        self.op = OP_DELETE_CLUSTER
        clusters = load_from_metadata(self.tenant_client,
                                      name=self.cluster_name)
        if len(clusters) != 1:
            raise CseServerError(f"Cluster {self.cluster_name} not found.")
        self.cluster = clusters[0]
        self.cluster_id = self.cluster['cluster_id']
        self.update_task(TaskStatus.RUNNING,
                         message=f"Deleting cluster {self.cluster_name}"
                         f"({self.cluster_id})")
        self.daemon = True
        self.start()
        result = {}
        result['cluster_name'] = self.cluster_name
        result['task_href'] = self.task_resource.get('href')
        return result
Пример #17
0
    def delete_cluster(self, headers, body):
        result = {}
        result['body'] = {}
        LOGGER.debug('about to delete cluster with name: %s' % body['name'])
        result['status_code'] = INTERNAL_SERVER_ERROR
        try:
            self.cluster_name = body['name']
            self.tenant_info = self._connect_tenant(headers)
            self.headers = headers
            self.body = body
            self.op = OP_DELETE_CLUSTER
            self._connect_sysadmin()
            clusters = load_from_metadata(self.client_tenant,
                                          name=self.cluster_name)
            if len(clusters) != 1:
                raise Exception('Cluster %s not found.' % self.cluster_name)
            self.cluster = clusters[0]
            self.cluster_id = self.cluster['cluster_id']

            self.update_task(TaskStatus.RUNNING,
                             self.op,
                             message='Deleting cluster %s(%s)' %
                             (self.cluster_name, self.cluster_id))
            self.daemon = True
            self.start()
            response_body = {}
            response_body['cluster_name'] = self.cluster_name
            response_body['task_href'] = self.t.get('href')
            result['body'] = response_body
            result['status_code'] = ACCEPTED
        except Exception as e:
            if hasattr(e, 'message'):
                result['body'] = {'message': e.message}
            else:
                result['body'] = {'message': str(e)}
            LOGGER.error(traceback.format_exc())
        return result
 def create_nodes(self, headers, body):
     result = {'body': {}}
     self.cluster_name = body['name']
     LOGGER.debug('about to add %s nodes to cluster %s on VDC %s, sp=%s',
                  body['node_count'], self.cluster_name, body['vdc'],
                  body['storage_profile'])
     result['status_code'] = INTERNAL_SERVER_ERROR
     try:
         if body['node_count'] < 1:
             raise Exception('Invalid node count: %s.' % body['node_count'])
         self.tenant_info = self._connect_tenant(headers)
         clusters = load_from_metadata(self.client_tenant,
                                       name=self.cluster_name)
         if len(clusters) != 1:
             raise Exception('Cluster \'%s\' not found.' %
                             self.cluster_name)
         self.cluster = clusters[0]
         self.headers = headers
         self.body = body
         self.op = OP_CREATE_NODES
         self._connect_sysadmin()
         self.cluster_id = self.cluster['cluster_id']
         self.update_task(
             TaskStatus.RUNNING,
             message='Adding %s node(s) to cluster %s(%s)' %
             (body['node_count'], self.cluster_name, self.cluster_id))
         self.daemon = True
         self.start()
         response_body = {}
         response_body['cluster_name'] = self.cluster_name
         response_body['task_href'] = self.task_resource.get('href')
         result['body'] = response_body
         result['status_code'] = ACCEPTED
     except Exception as e:
         result['body'] = self._to_message(e)
         LOGGER.error(traceback.format_exc())
     return result
Пример #19
0
    def create_nodes(self):
        # TODO(resize_cluster) Once this method is hooked to
        #  broker_manager, modify self.resize_cluster() to return only
        #  result['body'] not the entire response.
        result = {'body': {}}
        self.cluster_name = self.req_spec['name']
        LOGGER.debug(f"About to add {self.req_spec['node_count']} nodes to "
                     f"cluster {self.cluster_name} on VDC "
                     f"{self.req_spec['vdc']}")
        if self.req_spec['node_count'] < 1:
            raise CseServerError(f"Invalid node count: "
                                 f"{self.req_spec['node_count']}.")
        if self.req_spec['network'] is None:
            raise CseServerError(f'Network name is missing from the request.')

        self._connect_tenant()
        self._connect_sys_admin()
        clusters = load_from_metadata(self.tenant_client,
                                      name=self.cluster_name)
        if len(clusters) != 1:
            raise CseServerError(f"Cluster '{self.cluster_name}' not found.")
        self.cluster = clusters[0]
        self.op = OP_CREATE_NODES
        self.cluster_id = self.cluster['cluster_id']
        self.update_task(
            TaskStatus.RUNNING,
            message=f"Adding {self.req_spec['node_count']} node(s) to cluster "
            "{self.cluster_name}({self.cluster_id})")
        self.daemon = True
        self.start()
        response_body = {}
        response_body['cluster_name'] = self.cluster_name
        response_body['task_href'] = self.task_resource.get('href')
        result['body'] = response_body
        result['status_code'] = ACCEPTED
        return result
Пример #20
0
    def create_cluster_thread(self):
        network_name = self.body['network']
        try:
            clusters = load_from_metadata(self.client_tenant,
                                          name=self.cluster_name)
            if len(clusters) != 0:
                raise Exception('Cluster already exists.')
            org_resource = self.client_tenant.get_org()
            org = Org(self.client_tenant, resource=org_resource)
            vdc_resource = org.get_vdc(self.body['vdc'])
            vdc = VDC(self.client_tenant, resource=vdc_resource)
            template = self.get_template()
            self.update_task(TaskStatus.RUNNING,
                             self.op,
                             message='Creating cluster vApp %s(%s)' %
                             (self.cluster_name, self.cluster_id))
            vapp_resource = vdc.create_vapp(self.cluster_name,
                                            description='cluster %s' %
                                            self.cluster_name,
                                            network=network_name,
                                            fence_mode='bridged')
            t = self.client_tenant.get_task_monitor().wait_for_status(
                task=vapp_resource.Tasks.Task[0],
                timeout=60,
                poll_frequency=2,
                fail_on_status=None,
                expected_target_statuses=[
                    TaskStatus.SUCCESS, TaskStatus.ABORTED, TaskStatus.ERROR,
                    TaskStatus.CANCELED
                ],
                callback=None)
            assert t.get('status').lower() == TaskStatus.SUCCESS.value
            tags = {}
            tags['cse.cluster.id'] = self.cluster_id
            tags['cse.version'] = pkg_resources.require(
                'container-service-extension')[0].version
            tags['cse.template'] = template['name']
            vapp = VApp(self.client_tenant, href=vapp_resource.get('href'))
            for k, v in tags.items():
                t = vapp.set_metadata('GENERAL', 'READWRITE', k, v)
                self.client_tenant.get_task_monitor().\
                    wait_for_status(
                        task=t,
                        timeout=600,
                        poll_frequency=5,
                        fail_on_status=None,
                        expected_target_statuses=[TaskStatus.SUCCESS],
                        callback=None)
            self.update_task(TaskStatus.RUNNING,
                             self.op,
                             message='Creating master node for %s(%s)' %
                             (self.cluster_name, self.cluster_id))
            vapp.reload()
            add_nodes(1,
                      template,
                      TYPE_MASTER,
                      self.config,
                      self.client_tenant,
                      org,
                      vdc,
                      vapp,
                      self.body,
                      wait=True)

            self.update_task(TaskStatus.RUNNING,
                             self.op,
                             message='Initializing cluster %s(%s)' %
                             (self.cluster_name, self.cluster_id))

            vapp.reload()
            init_cluster(self.config, vapp, template)

            master_ip = get_master_ip(self.config, vapp, template)
            t = vapp.set_metadata('GENERAL', 'READWRITE', 'cse.master.ip',
                                  master_ip)
            self.client_tenant.get_task_monitor().\
                wait_for_status(
                    task=t,
                    timeout=600,
                    poll_frequency=5,
                    fail_on_status=None,
                    expected_target_statuses=[TaskStatus.SUCCESS],
                    callback=None)

            if self.body['node_count'] > 0:

                self.update_task(TaskStatus.RUNNING,
                                 self.op,
                                 message='Creating %s node(s) for %s(%s)' %
                                 (self.body['node_count'], self.cluster_name,
                                  self.cluster_id))
                add_nodes(self.body['node_count'],
                          template,
                          TYPE_NODE,
                          self.config,
                          self.client_tenant,
                          org,
                          vdc,
                          vapp,
                          self.body,
                          wait=True)
                self.update_task(TaskStatus.RUNNING,
                                 self.op,
                                 message='Adding %s node(s) to %s(%s)' %
                                 (self.body['node_count'], self.cluster_name,
                                  self.cluster_id))
                vapp.reload()
                join_cluster(self.config, vapp, template)

            self.update_task(TaskStatus.SUCCESS,
                             self.op,
                             message='Created cluster %s(%s)' %
                             (self.cluster_name, self.cluster_id))

        except Exception as e:
            LOGGER.error(traceback.format_exc())
            self.update_task(TaskStatus.ERROR, self.op, error_message=str(e))
    def create_cluster_thread(self):
        network_name = self.req_spec.get(RequestKey.NETWORK_NAME)
        try:
            clusters = load_from_metadata(self.tenant_client,
                                          name=self.cluster_name)
            if len(clusters) != 0:
                raise ClusterAlreadyExistsError(f"Cluster {self.cluster_name} "
                                                "already exists.")

            org_resource = self.tenant_client.get_org_by_name(
                self.req_spec.get(RequestKey.ORG_NAME))
            org = Org(self.tenant_client, resource=org_resource)
            vdc_resource = org.get_vdc(self.req_spec.get(RequestKey.OVDC_NAME))
            vdc = VDC(self.tenant_client, resource=vdc_resource)
            template = self._get_template()
            self._update_task(
                TaskStatus.RUNNING,
                message=f"Creating cluster vApp {self.cluster_name}"
                        f"({self.cluster_id})")
            try:
                vapp_resource = vdc.create_vapp(
                    self.cluster_name,
                    description=f"cluster {self.cluster_name}",
                    network=network_name,
                    fence_mode='bridged')
            except Exception as e:
                raise ClusterOperationError(
                    "Error while creating vApp:", str(e))

            self.tenant_client.get_task_monitor().wait_for_status(
                vapp_resource.Tasks.Task[0])
            tags = {}
            tags['cse.cluster.id'] = self.cluster_id
            tags['cse.version'] = pkg_resources.require(
                'container-service-extension')[0].version
            tags['cse.template'] = template['name']
            vapp = VApp(self.tenant_client, href=vapp_resource.get('href'))
            for k, v in tags.items():
                task = vapp.set_metadata('GENERAL', 'READWRITE', k, v)
                self.tenant_client.get_task_monitor().wait_for_status(task)
            self._update_task(
                TaskStatus.RUNNING,
                message=f"Creating master node for {self.cluster_name}"
                        f"({self.cluster_id})")
            vapp.reload()

            server_config = get_server_runtime_config()
            try:
                add_nodes(1, template, NodeType.MASTER, server_config,
                          self.tenant_client, org, vdc, vapp, self.req_spec)
            except Exception as e:
                raise MasterNodeCreationError(
                    "Error while adding master node:", str(e))

            self._update_task(
                TaskStatus.RUNNING,
                message=f"Initializing cluster {self.cluster_name}"
                        f"({self.cluster_id})")
            vapp.reload()
            init_cluster(server_config, vapp, template)
            master_ip = get_master_ip(server_config, vapp, template)
            task = vapp.set_metadata('GENERAL', 'READWRITE', 'cse.master.ip',
                                     master_ip)
            self.tenant_client.get_task_monitor().wait_for_status(task)
            if self.req_spec.get(RequestKey.NUM_WORKERS) > 0:
                self._update_task(
                    TaskStatus.RUNNING,
                    message=f"Creating "
                            f"{self.req_spec.get(RequestKey.NUM_WORKERS)} "
                            f"node(s) for "
                            f"{self.cluster_name}({self.cluster_id})")
                try:
                    add_nodes(self.req_spec.get(RequestKey.NUM_WORKERS),
                              template, NodeType.WORKER, server_config,
                              self.tenant_client, org, vdc, vapp,
                              self.req_spec)
                except Exception as e:
                    raise WorkerNodeCreationError(
                        "Error while creating worker node:", str(e))

                self._update_task(
                    TaskStatus.RUNNING,
                    message=f"Adding "
                            f"{self.req_spec.get(RequestKey.NUM_WORKERS)} "
                            f"node(s) to "
                            f"{self.cluster_name}({self.cluster_id})")
                vapp.reload()
                join_cluster(server_config, vapp, template)
            if self.req_spec.get(RequestKey.ENABLE_NFS):
                self._update_task(
                    TaskStatus.RUNNING,
                    message=f"Creating NFS node for {self.cluster_name}"
                            f"({self.cluster_id})")
                try:
                    add_nodes(1, template, NodeType.NFS,
                              server_config, self.tenant_client, org, vdc,
                              vapp, self.req_spec)
                except Exception as e:
                    raise NFSNodeCreationError(
                        "Error while creating NFS node:", str(e))

            self._update_task(
                TaskStatus.SUCCESS,
                message=f"Created cluster {self.cluster_name}"
                        f"({self.cluster_id})")
        except (MasterNodeCreationError, WorkerNodeCreationError,
                NFSNodeCreationError, ClusterJoiningError,
                ClusterInitializationError, ClusterOperationError) as e:
            LOGGER.error(traceback.format_exc())
            error_obj = error_to_json(e)
            stack_trace = \
                ''.join(error_obj[ERROR_MESSAGE_KEY][ERROR_STACKTRACE_KEY])
            self._update_task(
                TaskStatus.ERROR,
                error_message=error_obj[ERROR_MESSAGE_KEY]
                [ERROR_DESCRIPTION_KEY],
                stack_trace=stack_trace)
            raise e
        except Exception as e:
            LOGGER.error(traceback.format_exc())
            error_obj = error_to_json(e)
            stack_trace = \
                ''.join(error_obj[ERROR_MESSAGE_KEY][ERROR_STACKTRACE_KEY])
            self._update_task(
                TaskStatus.ERROR,
                error_message=error_obj[ERROR_MESSAGE_KEY][ERROR_DESCRIPTION_KEY], # noqa: E501
                stack_trace=stack_trace)
        finally:
            self._disconnect_sys_admin()
Пример #22
0
    def get_node_info(self, cluster_name, node_name, headers):
        """Get the info of a given node in the cluster.

        :param cluster_name: (str): Name of the cluster
        :param node_name: (str): Name of the node
        :param headers: (str): Request headers

        :return: (dict): Info of the node.
        """
        result = {}
        try:
            result['body'] = []
            result['status_code'] = OK
            self._connect_tenant(headers)
            clusters = load_from_metadata(self.client_tenant,
                                          name=cluster_name)
            if len(clusters) == 0:
                raise Exception('Cluster \'%s\' not found.' % cluster_name)
            vapp = VApp(self.client_tenant, href=clusters[0]['vapp_href'])
            vms = vapp.get_all_vms()
            node_info = None
            for vm in vms:
                if (node_name == vm.get('name')):
                    node_info = {
                        'name': vm.get('name'),
                        'numberOfCpus': '',
                        'memoryMB': '',
                        'status': VCLOUD_STATUS_MAP.get(int(vm.get('status'))),
                        'ipAddress': ''
                    }
                    if hasattr(vm, 'VmSpecSection'):
                        node_info[
                            'numberOfCpus'] = vm.VmSpecSection.NumCpus.text
                        node_info[
                            'memoryMB'] = \
                            vm.VmSpecSection.MemoryResourceMb.Configured.text
                    try:
                        node_info['ipAddress'] = vapp.get_primary_ip(
                            vm.get('name'))
                    except Exception:
                        LOGGER.debug('cannot get ip address '
                                     'for node %s' % vm.get('name'))
                    if vm.get('name').startswith(TYPE_MASTER):
                        node_info['node_type'] = 'master'
                    elif vm.get('name').startswith(TYPE_NODE):
                        node_info['node_type'] = 'node'
                    elif vm.get('name').startswith(TYPE_NFS):
                        node_info['node_type'] = 'nfsd'
                        exports = self._get_nfs_exports(
                            node_info['ipAddress'], vapp, vm)
                        node_info['exports'] = exports
            if node_info is None:
                raise Exception('Node \'%s\' not found in cluster \'%s\'' %
                                (node_name, cluster_name))
            result['body'] = node_info
        except Exception as e:
            LOGGER.error(traceback.format_exc())
            result['body'] = []
            result['status_code'] = INTERNAL_SERVER_ERROR
            result['message'] = str(e)
        return result
    def create_cluster_thread(self):
        network_name = self.body['network']
        try:
            clusters = load_from_metadata(self.tenant_client,
                                          name=self.cluster_name)
            if len(clusters) != 0:
                raise ClusterAlreadyExistsError(f"Cluster {self.cluster_name} "
                                                "already exists.")
            org_resource = self.tenant_client.get_org()
            org = Org(self.tenant_client, resource=org_resource)
            vdc_resource = org.get_vdc(self.body['vdc'])
            vdc = VDC(self.tenant_client, resource=vdc_resource)
            template = self.get_template()
            self.update_task(TaskStatus.RUNNING,
                             message='Creating cluster vApp %s(%s)' %
                             (self.cluster_name, self.cluster_id))
            try:
                vapp_resource = vdc.create_vapp(self.cluster_name,
                                                description='cluster %s' %
                                                self.cluster_name,
                                                network=network_name,
                                                fence_mode='bridged')
            except Exception as e:
                raise ClusterOperationError('Error while creating vApp:',
                                            str(e))

            self.tenant_client.get_task_monitor().wait_for_status(
                vapp_resource.Tasks.Task[0])
            tags = {}
            tags['cse.cluster.id'] = self.cluster_id
            tags['cse.version'] = pkg_resources.require(
                'container-service-extension')[0].version
            tags['cse.template'] = template['name']
            vapp = VApp(self.tenant_client, href=vapp_resource.get('href'))
            for k, v in tags.items():
                task = vapp.set_metadata('GENERAL', 'READWRITE', k, v)
                self.tenant_client.get_task_monitor().wait_for_status(task)
            self.update_task(TaskStatus.RUNNING,
                             message='Creating master node for %s(%s)' %
                             (self.cluster_name, self.cluster_id))
            vapp.reload()

            server_config = get_server_runtime_config()
            try:
                add_nodes(1, template, TYPE_MASTER, server_config,
                          self.tenant_client, org, vdc, vapp, self.body)
            except Exception as e:
                raise MasterNodeCreationError(
                    "Error while adding master node:", str(e))

            self.update_task(TaskStatus.RUNNING,
                             message='Initializing cluster %s(%s)' %
                             (self.cluster_name, self.cluster_id))
            vapp.reload()
            init_cluster(server_config, vapp, template)
            master_ip = get_master_ip(server_config, vapp, template)
            task = vapp.set_metadata('GENERAL', 'READWRITE', 'cse.master.ip',
                                     master_ip)
            self.tenant_client.get_task_monitor().wait_for_status(task)
            if self.body['node_count'] > 0:
                self.update_task(TaskStatus.RUNNING,
                                 message='Creating %s node(s) for %s(%s)' %
                                 (self.body['node_count'], self.cluster_name,
                                  self.cluster_id))
                try:
                    add_nodes(self.body['node_count'], template, TYPE_NODE,
                              server_config, self.tenant_client, org, vdc,
                              vapp, self.body)
                except Exception as e:
                    raise WorkerNodeCreationError(
                        "Error while creating worker node:", str(e))

                self.update_task(TaskStatus.RUNNING,
                                 message='Adding %s node(s) to %s(%s)' %
                                 (self.body['node_count'], self.cluster_name,
                                  self.cluster_id))
                vapp.reload()
                join_cluster(server_config, vapp, template)
            if self.body['enable_nfs']:
                self.update_task(TaskStatus.RUNNING,
                                 message='Creating NFS node for %s(%s)' %
                                 (self.cluster_name, self.cluster_id))
                try:
                    add_nodes(1, template, TYPE_NFS, server_config,
                              self.tenant_client, org, vdc, vapp, self.body)
                except Exception as e:
                    raise NFSNodeCreationError(
                        "Error while creating NFS node:", str(e))

            self.update_task(TaskStatus.SUCCESS,
                             message='Created cluster %s(%s)' %
                             (self.cluster_name, self.cluster_id))
        except (MasterNodeCreationError, WorkerNodeCreationError,
                NFSNodeCreationError, ClusterJoiningError,
                ClusterInitializationError, ClusterOperationError) as e:
            LOGGER.error(traceback.format_exc())
            error_obj = error_to_json(e)
            stack_trace = ''.join(error_obj[ERROR_MESSAGE][ERROR_STACKTRACE])
            self.update_task(
                TaskStatus.ERROR,
                error_message=error_obj[ERROR_MESSAGE][ERROR_DESCRIPTION],
                stack_trace=stack_trace)
            raise e
        except Exception as e:
            LOGGER.error(traceback.format_exc())
            error_obj = error_to_json(e)
            stack_trace = ''.join(error_obj[ERROR_MESSAGE][ERROR_STACKTRACE])
            self.update_task(
                TaskStatus.ERROR,
                error_message=error_obj[ERROR_MESSAGE][ERROR_DESCRIPTION],
                stack_trace=stack_trace)
        finally:
            self._disconnect_sys_admin()