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])
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
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
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
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()
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])
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
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
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
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
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