예제 #1
0
    def extract_loadbalanceHealthmonitor(self, healthmonitor_id):

        # check health monitor resource exist or not
        healthmonitor_col = self._collected_resources.get(healthmonitor_id)
        if healthmonitor_col:
            return healthmonitor_col

        try:
            healthmonitor = \
                self.neutron_api.show_health_monitor(self.context,
                                                     healthmonitor_id)
        except Exception as e:
            _msg = 'Create LB health monitor resource error: %s' % e
            LOG.error(_msg)
            raise exception.ResourceExtractFailed(reason=_msg)

        properties = {}

        healthmonitor_info = healthmonitor.get('health_monitor')

        properties['delay'] = healthmonitor_info.get('delay')
        properties['type'] = healthmonitor_info.get('type')
        properties['max_retries'] = healthmonitor_info.get('max_retries')
        properties['timeout'] = healthmonitor_info.get('timeout')

        healthmonitor_code = healthmonitor_info.get('expected_codes')
        healthmonitor_http = healthmonitor_info.get('http_method')
        healthmonitor_admin = healthmonitor_info.get('admin_state_up')
        healthmonitor_url = healthmonitor_info.get('url_path')
        if healthmonitor_code:
            properties['expected_codes'] = healthmonitor_code

        if healthmonitor_http:
            properties['http_method'] = healthmonitor_http

        if healthmonitor_admin:
            properties['admin_state_up'] = healthmonitor_admin

        if healthmonitor_url:
            properties['url_path'] = healthmonitor_url

        healthmonitor_type = "OS::Neutron::HealthMonitor"
        healthmonitor_name = 'loadbalanceHealthmonitor_%d' \
                             % self._get_resource_num(healthmonitor_type)

        healthmonitor_res = resource.Resource(healthmonitor_name,
                                              healthmonitor_type,
                                              healthmonitor_id,
                                              properties=properties)

        healthmonitor_dep = resource.ResourceDependency(
            healthmonitor_id, healthmonitor_name, '', healthmonitor_type)

        self._collected_resources[healthmonitor_id] = healthmonitor_res
        self._collected_dependencies[healthmonitor_id] = healthmonitor_dep

        return healthmonitor_res
예제 #2
0
    def extract_loadbalanceMembers(self, member_ids, pool_name):

        if not member_ids or not pool_name:
            LOG.error('Create LB member resource error: %s', pool_name)
            _msg = 'Create LB member resource error: member or pool is null.'
            raise exception.InvalidInput(reason=_msg)
        try:
            for member_id in member_ids:
                self.extract_loadbalanceMember(member_id, pool_name)
        except Exception as e:
            _msg = 'Create LB member resource error: %s' % e
            LOG.error(_msg)
            raise exception.ResourceExtractFailed(reason=_msg)
예제 #3
0
    def extract_loadbalanceVips(self, vip_ids):
        if not vip_ids:
            _msg = 'Create LB vip resource error: id is null.'
            LOG.error(_msg)
            raise exception.InvalidInput(reason=_msg)

        try:
            for vip_id in vip_ids:
                self.extract_loadbalanceVip(vip_id)
        except exception.ResourceExtractFailed:
            raise
        except Exception as e:
            _msg = 'Create LB vip resource error: %s' % e
            LOG.error(_msg)
            raise exception.ResourceExtractFailed(_msg)
예제 #4
0
    def extract_loadbalanceListeners(self, listener_ids, vip_id, vip_name):
        if not listener_ids:
            _msg = 'Create LB listener resource error: id is null.'
            LOG.error(_msg)
            raise exception.InvalidInput(reason=_msg)

        try:
            for listener_id in listener_ids:
                self.extract_loadbalanceListener(listener_id, vip_id, vip_name)
        except exception.ResourceExtractFailed:
            raise
        except Exception as e:
            _msg = 'Create LB listener resource error: %s' % e
            LOG.error(_msg)
            raise exception.ResourceExtractFailed(_msg)
예제 #5
0
    def extract_loadbalancePools(self, pool_ids):

        if not pool_ids:
            _msg = 'Create LB pool resource error: id is null.'
            LOG.error(_msg)
            raise exception.InvalidInput(reason=_msg)

        try:
            for pool_id in pool_ids:
                self.extract_loadbalancePool(pool_id)
        except exception.ResourceExtractFailed:
            raise
        except Exception as e:
            _msg = 'Create LB pool resource error: %s' % e
            LOG.error(_msg)
            raise exception.ResourceExtractFailed(_msg)
예제 #6
0
    def extract_loadbalanceListener(self, listener_id, vip_id, vip_name):

        listener_col = self._collected_resources.get(listener_id)

        if listener_col:
            return listener_col

        # 1 query listener info
        try:
            listener = self.neutron_api.show_listener(self.context,
                                                      listener_id, vip_id)
        except Exception as e:
            _msg = 'Create LB listener resource error: %s' % e
            LOG.error(_msg)
            raise exception.ResourceExtractFailed(reason=_msg)

        # 2 build listener resource and dependence
        listener_info = listener.get('listener')

        properties = {}
        dependencies = []
        properties['protocol'] = listener_info.get('protocol')
        properties['protocol_port'] = listener_info.get('protocol_port')
        properties['vip_id'] = {'get_resource': vip_name}
        dependencies.append(vip_name)

        listener_type = "OS::Neutron::Listener"
        listener_name = 'loadbalanceListener_%d' % \
            self._get_resource_num(listener_type)

        listener_res = resource.Resource(listener_name,
                                         listener_type,
                                         listener_id,
                                         properties=properties)

        # remove duplicate dependencies
        dependencies = {}.fromkeys(dependencies).keys()
        listener_dep = resource.ResourceDependency(listener_id,
                                                   listener_name,
                                                   '',
                                                   listener_type,
                                                   dependencies=dependencies)

        self._collected_resources[listener_id] = listener_res
        self._collected_dependencies[listener_id] = listener_dep

        return listener_res
예제 #7
0
    def extract_volumes(self, volume_ids, parent_name=None,
                        parent_resources=None):
        if not volume_ids:
            _msg = 'No volume resource to extract.'
            LOG.info(_msg)
            return

        try:
            for volume_id in volume_ids:
                self.extract_volume(volume_id, parent_name, parent_resources)
        except exception.ResourceExtractFailed:
            raise
        except exception.ResourceNotFound:
            raise
        except Exception as e:
            _msg = 'Create volume resource error: %s' % e
            LOG.error(_msg)
            raise exception.ResourceExtractFailed(_msg)
예제 #8
0
    def extract_consistency_groups(self,
                                   cg_ids,
                                   parent_name=None,
                                   parent_resources=None):
        if not cg_ids:
            _msg = 'Create consistency groups resource error: id is null.'
            LOG.error(_msg)
            raise exception.InvalidInput(reason=_msg)

        try:
            for cg_id in cg_ids:
                self.extract_consistency_group(cg_id, parent_name,
                                               parent_resources)
        except exception.ResourceExtractFailed:
            raise
        except Exception as e:
            _msg = 'Create consistency groups resource error: %s' % e
            LOG.error(_msg)
            raise exception.ResourceExtractFailed(_msg)
예제 #9
0
    def extract_loadbalanceHealthmonitors(self, healthmonitor_ids):

        if not healthmonitor_ids:
            _msg = 'Create LB health monitor resource error: id is null.'
            LOG.error(_msg)
            raise exception.InvalidInput(reason=_msg)

        res_list = []
        try:
            for healthmonitor_id in healthmonitor_ids:
                res = self.extract_loadbalanceHealthmonitor(healthmonitor_id)
                res_list.append(res)
        except exception.ResourceExtractFailed:
            raise
        except Exception as e:
            _msg = 'Create LB health monitor resource error: %s' % e
            LOG.error(_msg)
            raise exception.ResourceExtractFailed(reason=_msg)

        return res_list
예제 #10
0
    def extract_volume_types(self, volume_type_ids, parent_name=None,
                             parent_resources=None):
        if not volume_type_ids:
            _msg = 'Create volume type resource error: id is null.'
            LOG.error(_msg)
            raise exception.InvalidInput(reason=_msg)
        volume_type_res = []
        try:
            for volume_type_id in volume_type_ids:
                type_res = self.extract_volume_type(volume_type_id,
                                                    parent_name,
                                                    parent_resources)
                volume_type_res.append(type_res)
        except exception.ResourceExtractFailed:
            raise
        except exception.ResourceNotFound:
            raise
        except Exception as e:
            _msg = 'Create volume type resource error: %s' % e
            LOG.error(_msg)
            raise exception.ResourceExtractFailed(_msg)

        return volume_type_res
예제 #11
0
    def extract_qos(self, qos_id, parent_name=None,
                    parent_resources=None):

        LOG.debug('Create qos resource start: %s', qos_id)
        properties = {}
        # 1 check qos resource is existing or not
        qos_res = self._collected_resources.get(qos_id, None)
        if qos_res:
            LOG.debug('Create qos resource exist:  %s', qos_id)
            return qos_res
        # 2 query qos info
        try:
            qos_info = self.cinder_api.get_qos_specs(self.context, qos_id)
        except Exception as e:
            _msg = 'Create volume qos error: %s' % e
            LOG.error(_msg)
            raise exception.ResourceExtractFailed(reason=_msg)

        properties['specs'] = qos_info.get('specs')
        properties['name'] = qos_info.get('name')

        qos_type = "OS::Cinder::Qos"
        qos_name = 'CinderQos_%d' % self._get_resource_num(qos_type)
        if parent_name and qos_id in parent_resources:
            qos_name = parent_name + '.' + qos_name
        qos_res = resource.Resource(qos_name, qos_type,
                                    qos_id, properties=properties)

        qos_dep = resource.ResourceDependency(qos_id, qos_name, '',
                                              qos_type)

        self._collected_resources[qos_id] = qos_res
        self._collected_dependencies[qos_id] = qos_dep

        LOG.debug('Create qos resource end: %s', qos_id)
        return qos_res
예제 #12
0
    def extract_consistency_group(self,
                                  cg_id,
                                  parent_name=None,
                                  parent_resources=None):
        # check consistency group resource exist or not
        cgroup_col = self._collected_resources.get(cg_id)
        if cgroup_col:
            return cgroup_col
        try:
            consisgroup = self.cinder_api.get_consisgroup(self.context, cg_id)
        except Exception as e:
            _msg = 'Create consistency groups resource error: %s' % e
            LOG.error(_msg)
            raise exception.ResourceExtractFailed(reason=_msg)
        properties = {}
        cg_info = consisgroup.get('consistencygroup')
        properties['availability_zone'] = cg_info.get('availability_zone')
        properties['name'] = cg_info.get('name')
        properties['description'] = cg_info.get('description')
        cg_type = "OS::Cinder::ConsistencyGroup"
        cg_name = 'consistencyGroup%d' \
                  % self._get_resource_num(cg_type)
        if parent_name and cg_id in parent_resources:
            cg_name = parent_name + '.' + cg_name
        cg_res = resource.Resource(cg_name,
                                   cg_type,
                                   cg_id,
                                   properties=properties)
        cg_dependencies = resource.ResourceDependency(cg_id, cg_name,
                                                      cg_info.get('name'),
                                                      cg_type)
        volume_types_id = cg_info.get('volume_types')
        volume_driver = VolumeResource(
            self.context,
            collected_resources=self._collected_resources,
            collected_parameters=self._collected_parameters,
            collected_dependencies=self._collected_dependencies)
        if volume_types_id:
            volume_type_res = \
                volume_driver.extract_volume_types(volume_types_id,
                                                   cg_id,
                                                   parent_name,
                                                   parent_resources)
            volume_type_property = []
            for v in volume_type_res:
                # addd properties
                volume_type_property.append({'get_resource': v.name})
                res_name = v.properties.get('name', '')
                v_id = v.id
                v_type = v.type
                cg_dependencies.add_dependency(v_id, v.name, res_name, v_type)
        cg_res.add_property('volume_types', volume_type_property)
        volume_ids = []
        try:
            volumes = self.cinder_api.get_all(self.context)
            for volume in volumes:
                consistencygroup_id = volume.get('consistencygroup_id')
                if consistencygroup_id and consistencygroup_id == cg_id:
                    volume_ids.append(volume.get('id'))
        except Exception as e:
            _msg = 'Create consistency groups resource error: %s' % e
            LOG.error(_msg)
            raise exception.ResourceExtractFailed(reason=_msg)

        if volume_ids:
            volume_driver.extract_volumes(volume_ids, cg_id, parent_name,
                                          parent_resources)

        self._collected_resources = volume_driver.get_collected_resources()
        self._collected_dependencies = \
            volume_driver.get_collected_dependencies()

        self._collected_resources[cg_id] = cg_res
        self._collected_dependencies[cg_id] = cg_dependencies
예제 #13
0
    def extract_loadbalanceVip(self, vip_id, pool_name):

        # if vip resource exist in collect resource
        vip_col = self._collected_resources.get(vip_id)
        if vip_col:
            return vip_col
        dependences = []
        properties = {}

        # 1. query vip info
        try:
            vip_info = self.neutron_api.get_vip(self.context, vip_id)
        except Exception as e:
            _msg = 'Create LB vip resource error: %s' % e
            LOG.error(_msg)
            raise exception.ResourceExtractFailed(reason=_msg)

        properties['protocol_port'] = vip_info.get('protocol_port')
        properties['session_persistence'] = vip_info.\
            get('session_persistence')
        # properties['protocol'] = vip_info.get('protocol')
        vip_name = vip_info.get('name')
        vip_address = vip_info.get('address')
        vip_admin = vip_info.get('admin_state_up')
        vip_connection = vip_info.get('connection_limit')
        vip_des = vip_info.get('description')
        if vip_name:
            properties['name'] = vip_name

        if vip_address:
            properties['address'] = vip_address

        if vip_admin:
            properties['admin_state_up'] = vip_admin
        if vip_connection:
            properties['connection_limit'] = vip_connection
        if vip_des:
            properties['description'] = vip_des

        properties['pool_id'] = {'get_resource': pool_name}
        dependences.append(pool_name)

        # build subnet resource and build dependence relation
        subnet_id = vip_info.get('subnet_id')

        if subnet_id:
            newtwork_driver = \
                networks.NetworkResource(
                    self.context,
                    collected_resources=self._collected_resources,
                    collected_parameters=self._collected_parameters,
                    collected_dependencies=self._collected_dependencies)
            subnet_ids = []
            subnet_ids.append(subnet_id)
            subnet_res = newtwork_driver.extract_subnets(subnet_ids)
            dependences.append(subnet_res[0].name)
            properties['subnet'] = {'get_resource': subnet_res[0].name}

            # update collect resources and dependences
            self._collected_resources = \
                newtwork_driver.get_collected_resources()

            self._collected_dependencies = \
                newtwork_driver.get_collected_dependencies()

        vip_type = "OS::Neutron::Vip"
        vip_name = 'loadbalanceVip_%d' % self._get_resource_num(vip_type)

        # build listener resource and build dependence relation
        listener_extras = vip_info.get('extra_listeners')
        listener_ids = None
        if listener_extras:
            listener_ids = []
            for listener_extra in listener_extras:
                listener_id = listener_extra.get('id')
                listener_ids.append(listener_id)

        if listener_ids:
            listener_driver = \
                LoadbalanceListener(
                    self.context,
                    collected_resources=self._collected_resources,
                    collected_parameters=self._collected_parameters,
                    collected_dependencies=self._collected_dependencies)
            listener_driver.extract_loadbalanceListeners(
                listener_ids, vip_id, vip_name)

            # update collect resources and dependences
            self._collected_resources = \
                listener_driver.get_collected_resources()

            self._collected_dependencies = \
                listener_driver.get_collected_dependencies()

        vip_res = resource.Resource(vip_name,
                                    vip_type,
                                    vip_id,
                                    properties=properties)

        # remove duplicate dependencies
        dependencies = {}.fromkeys(dependences).keys()
        vip_dep = resource.ResourceDependency(vip_id,
                                              vip_name,
                                              '',
                                              vip_type,
                                              dependencies=dependencies)

        self._collected_resources[vip_id] = vip_res
        self._collected_dependencies[vip_id] = vip_dep

        return vip_res
예제 #14
0
    def extract_loadbalanceMember(self, member_id, pool_name):
        # check resource exist or not
        member_col = self._collected_resources.get(member_id)

        if member_col:
            return member_col

        properties = {}
        dependencies = []

        # query member info

        try:
            member = self.neutron_api.show_member(self.context, member_id)
        except Exception as e:
            _msg = 'Create LB member resource error: %s' % e
            LOG.error(_msg)
            raise exception.ResourceExtractFailed(reason=_msg)

        member_info = member.get('member')
        properties['address'] = member_info.get('address')
        properties['protocol_port'] = member_info.get('protocol_port')
        member_admin = member_info.get('admin_state_up')
        member_weight = member_info.get('weight')
        if member_admin:
            properties['admin_state_up'] = member_admin
        if member_weight:
            properties['weight'] = member_weight
        properties['pool_id'] = {'get_resource': pool_name}
        dependencies.append(pool_name)

        # if member relates to instances
        try:
            server_id = self._get_member_related_vm(properties['address'])

            if server_id:
                instance_driver = instances.InstanceResource(
                    self.context,
                    collected_resources=self._collected_resources,
                    collected_parameters=self._collected_parameters,
                    collected_dependencies=self._collected_dependencies)
                instance_ids = []
                instance_ids.append(server_id)
                reses = instance_driver.extract_instances(instance_ids)
                if reses:
                    instance_res_name = reses[0].name
                    dependencies.append(instance_res_name)

        except Exception as e:
            _msg = 'Create LB member resource error: %s' % e
            LOG.error(_msg)
            raise exception.ResourceExtractFailed(reason=_msg)

        # build member resource and build dependence relation
        member_type = "OS::Neutron::PoolMember"
        member_name = 'loadbalancePoolMember_%d' % \
            self._get_resource_num(member_type)

        member_res = resource.Resource(member_name,
                                       member_type,
                                       member_id,
                                       properties=properties)

        # remove duplicate dependencies
        dependencies = {}.fromkeys(dependencies).keys()
        member_dep = resource.ResourceDependency(member_id,
                                                 member_name,
                                                 '',
                                                 member_type,
                                                 dependencies=dependencies)

        self._collected_resources[member_id] = member_res
        self._collected_dependencies[member_id] = member_dep

        return member_res
예제 #15
0
    def extract_loadbalancePool(self, pool_id):

        pool_col = self._collected_resources.get(pool_id)

        if pool_col:
            return pool_col

        dependencies = []
        properties = {}

        # 1. query pool info
        try:
            pool = self.neutron_api.show_pool(self.context, pool_id)
        except Exception as e:
            LOG.error('Create LB pool %(pool)s resource error %(error)s', {
                'pool': pool_id,
                'error': e
            })
            _msg = 'Create LB pool resource error: %s' % e
            raise exception.ResourceExtractFailed(_msg)

        pool_info = pool.get('pool')

        properties['lb_method'] = pool_info.get('lb_method')
        properties['protocol'] = pool_info.get('protocol')
        pool_name = pool_info.get('name')
        pool_des = pool_info.get('description')
        pool_admin = pool_info.get('admin_state_up')
        if pool_name:
            properties['name'] = pool_name
        if pool_des:
            properties['description'] = pool_des
        if pool_admin:
            properties['admin_state_up'] = pool_admin

        # properties['provider'] = pool_info.get('provider')
        pool_type = "OS::Neutron::Pool"
        pool_name = 'loadbalancePool_%d' % self._get_resource_num(pool_type)

        # 2. build vip of pool and build dependence relation
        vip_id = pool_info.get('vip_id')
        if vip_id:
            vip_driver = \
                LoadbalanceVip(
                    self.context,
                    collected_resources=self._collected_resources,
                    collected_parameters=self._collected_parameters,
                    collected_dependencies=self._collected_dependencies)
            vip_res = vip_driver.extract_loadbalanceVip(vip_id, pool_name)
            properties['vip'] = {'get_resource': vip_res.name}
            # vip resource in lb resource list
            self._collected_resources = vip_driver.get_collected_resources()
            self._collected_dependencies = \
                vip_driver.get_collected_dependencies()

        subnet_id = pool_info.get('subnet_id')

        if subnet_id:
            # 3. build subnet resource and build dependence relation
            newtwork_driver = \
                networks.NetworkResource(
                    self.context,
                    collected_resources=self._collected_resources,
                    collected_parameters=self._collected_parameters,
                    collected_dependencies=self._collected_dependencies)
            subnet_ids = []
            subnet_ids.append(subnet_id)
            subnet_res = newtwork_driver.extract_subnets(subnet_ids)
            dependencies.append(subnet_res[0].name)
            properties['subnet'] = {'get_resource': subnet_res[0].name}

            # 3.2 add subnet resource in lb resource list
            self._collected_resources = \
                newtwork_driver.get_collected_resources()
            self._collected_dependencies = \
                newtwork_driver.get_collected_dependencies()

        # 4. build members of pool and build dependence relation
        member_ids = pool_info.get('members')

        if member_ids:
            lb_member_driver = \
                LoadbalanceMember(
                    self.context,
                    collected_resources=self._collected_resources,
                    collected_parameters=self._collected_parameters,
                    collected_dependencies=self._collected_dependencies)
            lb_member_driver.extract_loadbalanceMembers(member_ids, pool_name)

            # update collect resource
            self._collected_resources = \
                lb_member_driver.get_collected_resources()
            self._collected_dependencies = \
                lb_member_driver.get_collected_dependencies()

        # 4. query health monitor of pool and build dependence relation
        healthmonitor_ids = pool_info.get('health_monitors')

        if healthmonitor_ids:
            lb_healthmonitor_driver = \
                LoadbalanceHealthmonitor(
                    self.context,
                    collected_resources=self._collected_resources,
                    collected_parameters=self._collected_parameters,
                    collected_dependencies=self._collected_dependencies)
            ids = healthmonitor_ids
            h = lb_healthmonitor_driver.extract_loadbalanceHealthmonitors(ids)

            # update collect resource
            self._collected_resources = \
                lb_healthmonitor_driver.get_collected_resources()
            self._collected_dependencies = \
                lb_healthmonitor_driver.get_collected_dependencies()

            # add all healthmonitor to pool dependences
            monitors = []
            for res in h:
                dependencies.append(res.name)
                monitors.append({'get_resource': res.name})

            properties['monitors'] = monitors

        pool_type = "OS::Neutron::Pool"
        pool_name = 'loadbalancePool_%d' % self._get_resource_num(pool_type)

        pool_res = resource.Resource(pool_name,
                                     pool_type,
                                     pool_id,
                                     properties=properties)

        # remove duplicate dependencies
        dependencies = {}.fromkeys(dependencies).keys()
        pool_dep = resource.ResourceDependency(pool_id,
                                               pool_name,
                                               '',
                                               pool_type,
                                               dependencies=dependencies)

        self._collected_resources[pool_id] = pool_res
        self._collected_dependencies[pool_id] = pool_dep