def test_merged_list_from_content(self):
     req_md = merger.merged_list_from_content(SOFTWARE_CONFIG_DATA, ["deployments"], "collectme")
     self.assertEqual(4, len(req_md))
     self.assertEqual(SOFTWARE_CONFIG_DATA["deployments"], req_md[0][1]["deployments"])
     self.assertEqual(("dep-name1", {"config1": "value1"}), req_md[1])
     self.assertEqual(("dep-name2", {"config2": "value2"}), req_md[2])
     self.assertEqual(("dep-name3", {"config3": "value3"}), req_md[3])
示例#2
0
    def collect(self):
        if CONF.request.metadata_url is None:
            logger.info('No metadata_url configured.')
            raise exc.RequestMetadataNotConfigured
        url = CONF.request.metadata_url
        timeout = CONF.request.timeout
        final_content = {}

        try:
            head = self._session.head(url, timeout=timeout)
            last_modified = self.check_fetch_content(head.headers)

            content = self._session.get(url, timeout=timeout)
            content.raise_for_status()
            self.last_modified = last_modified

        except self._requests_impl.exceptions.RequestException as e:
            logger.warn(e)
            raise exc.RequestMetadataNotAvailable
        try:
            value = json.loads(content.text)
        except ValueError as e:
            logger.warn(
                'Failed to parse as json. (%s)' % e)
            raise exc.RequestMetadataNotAvailable
        final_content.update(value)

        final_list = merger.merged_list_from_content(
            final_content, cfg.CONF.deployment_key, name)
        return final_list
示例#3
0
    def collect(self):
        if CONF.request.metadata_url is None:
            logger.info('No metadata_url configured.')
            raise exc.RequestMetadataNotConfigured
        url = CONF.request.metadata_url
        final_content = {}

        try:
            head = self._session.head(url)
            last_modified = self.check_fetch_content(head.headers)

            content = self._session.get(url)
            content.raise_for_status()
            self.last_modified = last_modified

        except self._requests_impl.exceptions.RequestException as e:
            logger.warn(e)
            raise exc.RequestMetadataNotAvailable
        try:
            value = json.loads(content.text)
        except ValueError as e:
            logger.warn(
                'Failed to parse as json. (%s)' % e)
            raise exc.RequestMetadataNotAvailable
        final_content.update(value)

        final_list = merger.merged_list_from_content(
            final_content, cfg.CONF.deployment_key, name)
        return final_list
示例#4
0
    def collect(self):
        if CONF.gcore.api_url is None:
            logger.info('No api_url configured.')
            raise exc.GcoreMetadataNotConfigured
        if CONF.gcore.access_token is None:
            logger.info('No access_token configured.')
            raise exc.GcoreMetadataNotConfigured
        if CONF.gcore.refresh_token is None:
            logger.info('No refresh_token configured.')
            raise exc.GcoreMetadataNotConfigured
        if CONF.gcore.project_id is None:
            logger.info('No project_id configured.')
            raise exc.GcoreMetadataNotConfigured
        if CONF.gcore.region_id is None:
            logger.info('No region_id configured.')
            raise exc.GcoreMetadataNotConfigured
        if CONF.gcore.stack_id is None:
            logger.info('No stack_id configured.')
            raise exc.GcoreMetadataNotConfigured
        if CONF.gcore.resource_name is None:
            logger.info('No resource_name configured.')
            raise exc.GcoreMetadataNotConfigured

        if self.client is None:
            self.client = GcoreHeatResourceClient.from_conf(CONF.gcore)

        try:
            logger.debug('Fetching metadata from %s', self.client.api_url)
            response = self.client.get_metadata()
            final_list = merger.merged_list_from_content(response, cfg.CONF.deployment_key, name)
            return final_list
        except Exception as e:
            logger.warn(str(e))
            raise exc.GcoreMetadataNotAvailable
示例#5
0
    def collect(self):
        if CONF.zaqar.auth_url is None:
            logger.warn('No auth_url configured.')
            raise exc.ZaqarMetadataNotConfigured()
        if CONF.zaqar.password is None:
            logger.warn('No password configured.')
            raise exc.ZaqarMetadataNotConfigured()
        if CONF.zaqar.project_id is None:
            logger.warn('No project_id configured.')
            raise exc.ZaqarMetadataNotConfigured()
        if CONF.zaqar.user_id is None:
            logger.warn('No user_id configured.')
            raise exc.ZaqarMetadataNotConfigured()
        if CONF.zaqar.queue_id is None:
            logger.warn('No queue_id configured.')
            raise exc.ZaqarMetadataNotConfigured()
        if CONF.zaqar.ssl_certificate_validation is True and (
                CONF.zaqar.ca_file is None):
            logger.warn('No CA file configured when flag ssl certificate '
                        'validation is on.')
            raise exc.ZaqarMetadataNotConfigured()
        # NOTE(flwang): To be compatible with old versions, we won't throw
        # error here if there is no region name.

        try:
            ks = keystone.Keystone(auth_url=CONF.zaqar.auth_url,
                                   user_id=CONF.zaqar.user_id,
                                   password=CONF.zaqar.password,
                                   project_id=CONF.zaqar.project_id,
                                   keystoneclient=self.keystoneclient,
                                   discover_class=self.discover_class).client

            conf = {
                'auth_opts': {
                    'backend': 'keystone',
                    'options': {
                        'os_auth_token': ks.auth_token,
                        'os_project_id': CONF.zaqar.project_id,
                        'insecure': not CONF.zaqar.ssl_certificate_validation,
                        'cacert': CONF.zaqar.ca_file
                    }
                }
            }

            if CONF.zaqar.use_websockets:
                data = self.get_data_websocket(ks, conf)
            else:
                data = self.get_data_wsgi(ks, conf)

            final_list = merger.merged_list_from_content(
                data, cfg.CONF.deployment_key, name)
            return final_list

        except Exception as e:
            logger.warn(str(e))
            raise exc.ZaqarMetadataNotAvailable()
示例#6
0
 def test_merged_list_from_content(self):
     req_md = merger.merged_list_from_content(
         SOFTWARE_CONFIG_DATA,
         ['deployments'],
         'collectme')
     self.assertEqual(4, len(req_md))
     self.assertEqual(
         SOFTWARE_CONFIG_DATA['deployments'], req_md[0][1]['deployments'])
     self.assertEqual(
         ('dep-name1', {'config1': 'value1'}), req_md[1])
     self.assertEqual(
         ('dep-name2', {'config2': 'value2'}), req_md[2])
     self.assertEqual(
         ('dep-name3', {'config3': 'value3'}), req_md[3])
示例#7
0
    def collect(self):
        if CONF.heat.auth_url is None:
            logger.info('No auth_url configured.')
            raise exc.HeatMetadataNotConfigured
        if CONF.heat.password is None:
            logger.info('No password configured.')
            raise exc.HeatMetadataNotConfigured
        if CONF.heat.project_id is None:
            logger.info('No project_id configured.')
            raise exc.HeatMetadataNotConfigured
        if CONF.heat.user_id is None:
            logger.info('No user_id configured.')
            raise exc.HeatMetadataNotConfigured
        if CONF.heat.stack_id is None:
            logger.info('No stack_id configured.')
            raise exc.HeatMetadataNotConfigured
        if CONF.heat.resource_name is None:
            logger.info('No resource_name configured.')
            raise exc.HeatMetadataNotConfigured
        # NOTE(flwang): To be compatible with old versions, we won't throw
        # error here if there is no region name.

        try:
            ks = keystone.Keystone(auth_url=CONF.heat.auth_url,
                                   user_id=CONF.heat.user_id,
                                   password=CONF.heat.password,
                                   project_id=CONF.heat.project_id,
                                   keystoneclient=self.keystoneclient,
                                   discover_class=self.discover_class).client
            kwargs = {
                'service_type': 'orchestration',
                'endpoint_type': 'publicURL'
            }
            if CONF.heat.region_name:
                kwargs['region_name'] = CONF.heat.region_name
            endpoint = ks.service_catalog.url_for(**kwargs)
            logger.debug('Fetching metadata from %s' % endpoint)
            heat = self.heatclient.Client('1', endpoint, token=ks.auth_token)
            r = heat.resources.metadata(CONF.heat.stack_id,
                                        CONF.heat.resource_name)

            final_list = merger.merged_list_from_content(
                r, cfg.CONF.deployment_key, name)
            return final_list

        except Exception as e:
            logger.warn(str(e))
            raise exc.HeatMetadataNotAvailable
示例#8
0
    def collect(self):
        if CONF.heat.auth_url is None:
            logger.info('No auth_url configured.')
            raise exc.HeatMetadataNotConfigured
        if CONF.heat.password is None:
            logger.info('No password configured.')
            raise exc.HeatMetadataNotConfigured
        if CONF.heat.project_id is None:
            logger.info('No project_id configured.')
            raise exc.HeatMetadataNotConfigured
        if CONF.heat.user_id is None:
            logger.info('No user_id configured.')
            raise exc.HeatMetadataNotConfigured
        if CONF.heat.stack_id is None:
            logger.info('No stack_id configured.')
            raise exc.HeatMetadataNotConfigured
        if CONF.heat.resource_name is None:
            logger.info('No resource_name configured.')
            raise exc.HeatMetadataNotConfigured

        try:
            ks = keystone.Keystone(
                auth_url=CONF.heat.auth_url,
                user_id=CONF.heat.user_id,
                password=CONF.heat.password,
                project_id=CONF.heat.project_id,
                keystoneclient=self.keystoneclient).client
            endpoint = ks.service_catalog.url_for(
                service_type='orchestration', endpoint_type='publicURL')
            logger.debug('Fetching metadata from %s' % endpoint)
            heat = self.heatclient.Client(
                '1', endpoint, token=ks.auth_token)
            r = heat.resources.metadata(CONF.heat.stack_id,
                                        CONF.heat.resource_name)

            final_list = merger.merged_list_from_content(
                r, cfg.CONF.deployment_key, name)
            return final_list

        except Exception as e:
            logger.warn(str(e))
            raise exc.HeatMetadataNotAvailable
示例#9
0
    def collect(self):
        if CONF.heat.auth_url is None:
            logger.info('No auth_url configured.')
            raise exc.HeatMetadataNotConfigured
        if CONF.heat.password is None:
            logger.info('No password configured.')
            raise exc.HeatMetadataNotConfigured
        if CONF.heat.project_id is None:
            logger.info('No project_id configured.')
            raise exc.HeatMetadataNotConfigured
        if CONF.heat.user_id is None:
            logger.info('No user_id configured.')
            raise exc.HeatMetadataNotConfigured
        if CONF.heat.stack_id is None:
            logger.info('No stack_id configured.')
            raise exc.HeatMetadataNotConfigured
        if CONF.heat.resource_name is None:
            logger.info('No resource_name configured.')
            raise exc.HeatMetadataNotConfigured

        try:
            ks = keystone.Keystone(auth_url=CONF.heat.auth_url,
                                   user_id=CONF.heat.user_id,
                                   password=CONF.heat.password,
                                   project_id=CONF.heat.project_id,
                                   keystoneclient=self.keystoneclient).client
            endpoint = ks.service_catalog.url_for(service_type='orchestration',
                                                  endpoint_type='publicURL')
            logger.debug('Fetching metadata from %s' % endpoint)
            heat = self.heatclient.Client('1', endpoint, token=ks.auth_token)
            r = heat.resources.metadata(CONF.heat.stack_id,
                                        CONF.heat.resource_name)

            final_list = merger.merged_list_from_content(
                r, cfg.CONF.deployment_key, name)
            return final_list

        except Exception as e:
            logger.warn(str(e))
            raise exc.HeatMetadataNotAvailable
示例#10
0
    def collect(self):
        if CONF.cfn.metadata_url is None:
            if (CONF.cfn.heat_metadata_hint
                    and os.path.exists(CONF.cfn.heat_metadata_hint)):
                with open(CONF.cfn.heat_metadata_hint) as hint:
                    CONF.cfn.metadata_url = '%s/v1/' % hint.read().strip()
            else:
                logger.info('No metadata_url configured.')
                raise exc.CfnMetadataNotConfigured
        if CONF.cfn.access_key_id is None:
            logger.info('No Access Key ID configured.')
            raise exc.CfnMetadataNotConfigured
        if CONF.cfn.secret_access_key is None:
            logger.info('No Secret Access Key configured.')
            raise exc.CfnMetadataNotConfigured
        url = CONF.cfn.metadata_url
        stack_name = CONF.cfn.stack_name
        headers = {'Content-Type': 'application/json'}
        final_content = {}
        if CONF.cfn.path is None:
            logger.info('No path configured')
            raise exc.CfnMetadataNotConfigured

        signer = ec2_utils.Ec2Signer(secret_key=CONF.cfn.secret_access_key)
        for path in CONF.cfn.path:
            if '.' not in path:
                logger.error('Path not in format resource.field[.x.y] (%s)' %
                             path)
                raise exc.CfnMetadataNotConfigured
            resource, field = path.split('.', 1)
            if '.' in field:
                field, sub_path = field.split('.', 1)
            else:
                sub_path = ''
            params = {'Action': 'DescribeStackResource',
                      'StackName': stack_name,
                      'LogicalResourceId': resource,
                      'AWSAccessKeyId': CONF.cfn.access_key_id,
                      'SignatureVersion': '2'}
            parsed_url = urlparse.urlparse(url)
            credentials = {'params': params,
                           'verb': 'GET',
                           'host': parsed_url.netloc,
                           'path': parsed_url.path}
            params['Signature'] = signer.generate(credentials)
            try:
                content = self._session.get(
                    url, params=params, headers=headers,
                    verify=CONF.cfn.ca_certificate,
                    timeout=CONF.cfn.timeout)
                content.raise_for_status()
            except self._requests_impl.exceptions.RequestException as e:
                logger.warn(e)
                raise exc.CfnMetadataNotAvailable
            map_content = etree.fromstring(content.text)
            resource_detail = map_content.find(
                'DescribeStackResourceResult').find('StackResourceDetail')
            sub_element = resource_detail.find(field)
            if sub_element is None:
                logger.warn('Path %s does not exist.' % (path))
                raise exc.CfnMetadataNotAvailable
            try:
                value = json.loads(sub_element.text)
            except ValueError as e:
                logger.warn(
                    'Path %s failed to parse as json. (%s)' % (path, e))
                raise exc.CfnMetadataNotAvailable
            if sub_path:
                for subkey in sub_path.split('.'):
                    try:
                        value = value[subkey]
                    except KeyError:
                        logger.warn(
                            'Sub-key %s does not exist. (%s)' % (subkey, path))
                        raise exc.CfnMetadataNotAvailable
            final_content.update(value)
        final_list = merger.merged_list_from_content(
            final_content, cfg.CONF.cfn.deployment_key, name)
        return final_list
示例#11
0
    def collect(self):
        if CONF.cfn.metadata_url is None:
            if (CONF.cfn.heat_metadata_hint
                    and os.path.exists(CONF.cfn.heat_metadata_hint)):
                with open(CONF.cfn.heat_metadata_hint) as hint:
                    CONF.cfn.metadata_url = '%s/v1/' % hint.read().strip()
            else:
                logger.info('No metadata_url configured.')
                raise exc.CfnMetadataNotConfigured
        if CONF.cfn.access_key_id is None:
            logger.info('No Access Key ID configured.')
            raise exc.CfnMetadataNotConfigured
        if CONF.cfn.secret_access_key is None:
            logger.info('No Secret Access Key configured.')
            raise exc.CfnMetadataNotConfigured
        url = CONF.cfn.metadata_url
        stack_name = CONF.cfn.stack_name
        headers = {'Content-Type': 'application/json'}
        final_content = {}
        if CONF.cfn.path is None:
            logger.info('No path configured')
            raise exc.CfnMetadataNotConfigured

        signer = ec2_utils.Ec2Signer(secret_key=CONF.cfn.secret_access_key)
        for path in CONF.cfn.path:
            if '.' not in path:
                logger.error('Path not in format resource.field[.x.y] (%s)' %
                             path)
                raise exc.CfnMetadataNotConfigured
            resource, field = path.split('.', 1)
            if '.' in field:
                field, sub_path = field.split('.', 1)
            else:
                sub_path = ''
            params = {'Action': 'DescribeStackResource',
                      'StackName': stack_name,
                      'LogicalResourceId': resource,
                      'AWSAccessKeyId': CONF.cfn.access_key_id,
                      'SignatureVersion': '2'}
            parsed_url = urlparse.urlparse(url)
            credentials = {'params': params,
                           'verb': 'GET',
                           'host': parsed_url.netloc,
                           'path': parsed_url.path}
            params['Signature'] = signer.generate(credentials)
            try:
                content = self._session.get(
                    url, params=params, headers=headers,
                    verify=CONF.cfn.ca_certificate)
                content.raise_for_status()
            except self._requests_impl.exceptions.RequestException as e:
                logger.warn(e)
                raise exc.CfnMetadataNotAvailable
            map_content = etree.fromstring(content.text)
            resource_detail = map_content.find(
                'DescribeStackResourceResult').find('StackResourceDetail')
            sub_element = resource_detail.find(field)
            if sub_element is None:
                logger.warn('Path %s does not exist.' % (path))
                raise exc.CfnMetadataNotAvailable
            try:
                value = json.loads(sub_element.text)
            except ValueError as e:
                logger.warn(
                    'Path %s failed to parse as json. (%s)' % (path, e))
                raise exc.CfnMetadataNotAvailable
            if sub_path:
                for subkey in sub_path.split('.'):
                    try:
                        value = value[subkey]
                    except KeyError:
                        logger.warn(
                            'Sub-key %s does not exist. (%s)' % (subkey, path))
                        raise exc.CfnMetadataNotAvailable
            final_content.update(value)
        final_list = merger.merged_list_from_content(
            final_content, cfg.CONF.cfn.deployment_key, name)
        return final_list