def _retrieve_path_data(self, path): parts = path.split('.', 3) if len(parts) < 2: raise FatalUpdateError( "Unsupported path: paths must be in the form Resources.<LogicalResourceId>(.Metadata|PhysicalResourceId)(.<optional Metadata subkey>). Input: %s" % path) if parts[0].lower() != 'resources': raise FatalUpdateError( 'Unsupported path: only changes to Resources are supported (path: %s)' % path) if len(parts) == 2: resourcePart = None elif parts[2].lower() not in ['metadata', 'physicalresourceid']: raise FatalUpdateError( "Unsupported path: only Metadata or PhysicalResourceId can be specified after LogicalResourceId (path: %s)" % path) else: resourcePart = parts[2].lower() logical_id = parts[1] subpath = ('' if len(parts) < 4 else parts[3]) if logical_id not in self._resource_cache: self._resource_cache[ logical_id] = self.client.describe_stack_resource( logical_id, self.stack_name) resource = self._resource_cache[logical_id] status = resource.resourceStatus if status and status.endswith('_IN_PROGRESS'): log.debug("Skipping resource %s in %s as it is in status %s", logical_id, self.stack_name, status) raise InFlightStatusError('%s in %s is in status %s' % (logical_id, self.stack_name, status)) if resourcePart == 'metadata': if not resource.metadata: log.warn("No metadata for %s in %s", logical_id, self.stack_name) return None return util.extract_value(resource.metadata, subpath) elif 'DELETE_COMPLETE' == status: return None elif resourcePart == 'physicalresourceid': return resource.physicalResourceId else: return resource.lastUpdated
def _retrieve_path_data(self, path): parts = path.split('.', 3) if len(parts) < 2: raise FatalUpdateError("Unsupported path: paths must be in the form Resources.<LogicalResourceId>(.Metadata|PhysicalResourceId)(.<optional Metadata subkey>). Input: %s" % path) if parts[0].lower() != 'resources': raise FatalUpdateError('Unsupported path: only changes to Resources are supported (path: %s)' % path) if len(parts) == 2: resourcePart = None elif parts[2].lower() not in ['metadata', 'physicalresourceid']: raise FatalUpdateError("Unsupported path: only Metadata or PhysicalResourceId can be specified after LogicalResourceId (path: %s)" % path) else: resourcePart = parts[2].lower() logical_id = parts[1] subpath = ('' if len(parts) < 4 else parts[3]) if logical_id not in self._resource_cache: self._resource_cache[logical_id] = self.client.describe_stack_resource(logical_id, self.stack_name) resource = self._resource_cache[logical_id] status = resource.resourceStatus if status and status.endswith('_IN_PROGRESS'): log.debug("Skipping resource %s in %s as it is in status %s", logical_id, self.stack_name, status) raise InFlightStatusError('%s in %s is in status %s' % (logical_id, self.stack_name, status)) if resourcePart == 'metadata': if not resource.metadata: log.warn("No metadata for %s in %s", logical_id, self.stack_name) return None return util.extract_value(resource.metadata, subpath) elif 'DELETE_COMPLETE' == status: return None elif resourcePart == 'physicalresourceid': return resource.physicalResourceId else: return resource.lastUpdated