def test_resource_get_by_physical_resource_id(self): create_resource(self.ctx, self.stack) ret_res = db_api.resource_get_by_physical_resource_id(self.ctx, UUID1) self.assertIsNotNone(ret_res) self.assertEqual(UUID1, ret_res.nova_instance) self.assertIsNone(db_api.resource_get_by_physical_resource_id(self.ctx, UUID2))
def test_resource_get_by_physical_resource_id(self): create_resource(self.ctx, self.stack) ret_res = db_api.resource_get_by_physical_resource_id(self.ctx, UUID1) self.assertIsNotNone(ret_res) self.assertEqual(UUID1, ret_res.nova_instance) self.assertIsNone( db_api.resource_get_by_physical_resource_id(self.ctx, UUID2))
def _push_metadata_software_deployments( self, cnxt, server_id, stack_user_project_id): rs = db_api.resource_get_by_physical_resource_id(cnxt, server_id) if not rs: return cnxt.session.refresh(rs) if rs.action == resource.Resource.DELETE: return deployments = self.metadata_software_deployments(cnxt, server_id) md = rs.rsrc_metadata or {} md['deployments'] = deployments rows_updated = db_api.resource_update( cnxt, rs.id, {'rsrc_metadata': md}, rs.atomic_key) if not rows_updated: action = _('deployments of server %s') % server_id raise exception.ConcurrentTransaction(action=action) metadata_put_url = None metadata_queue_id = None for rd in rs.data: if rd.key == 'metadata_put_url': metadata_put_url = rd.value if rd.key == 'metadata_queue_id': metadata_queue_id = rd.value if metadata_put_url: json_md = jsonutils.dumps(md) requests.put(metadata_put_url, json_md) if metadata_queue_id: project = stack_user_project_id queue = self._get_zaqar_queue(cnxt, rs, project, metadata_queue_id) zaqar_plugin = cnxt.clients.client_plugin('zaqar') queue.post({'body': md, 'ttl': zaqar_plugin.DEFAULT_TTL})
def _push_metadata_software_deployments(self, cnxt, server_id, stack_user_project_id): rs = db_api.resource_get_by_physical_resource_id(cnxt, server_id) if not rs: return cnxt.session.refresh(rs) deployments = self.metadata_software_deployments(cnxt, server_id) md = rs.rsrc_metadata or {} md['deployments'] = deployments rows_updated = db_api.resource_update(cnxt, rs.id, {'rsrc_metadata': md}, rs.atomic_key) if not rows_updated: action = _('deployments of server %s') % server_id raise exception.ConcurrentTransaction(action=action) metadata_put_url = None metadata_queue_id = None for rd in rs.data: if rd.key == 'metadata_put_url': metadata_put_url = rd.value if rd.key == 'metadata_queue_id': metadata_queue_id = rd.value if metadata_put_url: json_md = jsonutils.dumps(md) requests.put(metadata_put_url, json_md) if metadata_queue_id: project = stack_user_project_id queue = self._get_zaqar_queue(cnxt, rs, project, metadata_queue_id) zaqar_plugin = cnxt.clients.client_plugin('zaqar') queue.post({'body': md, 'ttl': zaqar_plugin.DEFAULT_TTL})
def _push_metadata_software_deployments( self, cnxt, server_id, stack_user_project_id): rs = db_api.resource_get_by_physical_resource_id(cnxt, server_id) if not rs: return cnxt.session.refresh(rs) if rs.action == resource.Resource.DELETE: return deployments = self.metadata_software_deployments(cnxt, server_id) md = rs.rsrc_metadata or {} md['deployments'] = deployments metadata_put_url = None metadata_queue_id = None metadata_headers = None for rd in rs.data: if rd.key == 'metadata_put_url': metadata_put_url = rd.value if rd.key == 'metadata_queue_id': metadata_queue_id = rd.value if metadata_put_url: data = requests.head(metadata_put_url) etag = data.headers.get('etag') if etag: metadata_headers = {'if-match': etag} else: LOG.warning("Couldn't find existing Swift metadata " "for server %s", server_id) rows_updated = db_api.resource_update( cnxt, rs.id, {'rsrc_metadata': md}, rs.atomic_key) if not rows_updated: LOG.debug('Conflict on deployment metadata update for ' 'server %s; retrying', server_id) action = _('deployments of server %s') % server_id raise exception.ConcurrentTransaction(action=action) LOG.debug('Updated deployment metadata for server %s', server_id) if metadata_put_url: json_md = jsonutils.dumps(md) resp = requests.put(metadata_put_url, json_md, headers=metadata_headers) if resp.status_code == requests.codes.precondition_failed: LOG.debug('Conflict on Swift deployment update for ' 'server %s; retrying', server_id) action = _('deployments of server %s') % server_id raise exception.ConcurrentTransaction(action=action) else: try: resp.raise_for_status() except requests.HTTPError as exc: LOG.error('Failed to deliver deployment data to ' 'server %s: %s', server_id, exc) if metadata_queue_id: project = stack_user_project_id queue = self._get_zaqar_queue(cnxt, rs, project, metadata_queue_id) zaqar_plugin = cnxt.clients.client_plugin('zaqar') queue.post({'body': md, 'ttl': zaqar_plugin.DEFAULT_TTL})
def _push_metadata_software_deployments( self, cnxt, server_id, stack_user_project_id): rs = db_api.resource_get_by_physical_resource_id(cnxt, server_id) if not rs: return cnxt.session.refresh(rs) if rs.action == resource.Resource.DELETE: return deployments = self.metadata_software_deployments(cnxt, server_id) md = rs.rsrc_metadata or {} md['deployments'] = deployments metadata_put_url = None metadata_queue_id = None for rd in rs.data: if rd.key == 'metadata_put_url': metadata_put_url = rd.value if rd.key == 'metadata_queue_id': metadata_queue_id = rd.value action = _('deployments of server %s') % server_id atomic_key = rs.atomic_key rows_updated = db_api.resource_update( cnxt, rs.id, {'rsrc_metadata': md}, atomic_key) if not rows_updated: LOG.debug('Retrying server %s deployment metadata update', server_id) raise exception.ConcurrentTransaction(action=action) LOG.debug('Updated server %s deployment metadata', server_id) if metadata_put_url: json_md = jsonutils.dumps(md) resp = requests.put(metadata_put_url, json_md) try: resp.raise_for_status() except requests.HTTPError as exc: LOG.error('Failed to deliver deployment data to ' 'server %s: %s', server_id, exc) if metadata_queue_id: project = stack_user_project_id queue = self._get_zaqar_queue(cnxt, rs, project, metadata_queue_id) zaqar_plugin = cnxt.clients.client_plugin('zaqar') queue.post({'body': md, 'ttl': zaqar_plugin.DEFAULT_TTL}) # Bump the atomic key again to serialise updates to the data sent to # the server via Swift. if metadata_put_url is not None: rows_updated = db_api.resource_update(cnxt, rs.id, {}, atomic_key + 1) if not rows_updated: LOG.debug('Concurrent update to server %s deployments data ' 'detected - retrying.', server_id) raise exception.ConcurrentTransaction(action=action)
def _refresh_zaqar_software_deployment(self, cnxt, sd, deploy_queue_id): rs = db_api.resource_get_by_physical_resource_id(cnxt, sd.id) project = sd.stack_user_project_id queue = self._get_zaqar_queue(cnxt, rs, project, deploy_queue_id) messages = list(queue.pop()) if messages: self.signal_software_deployment( cnxt, sd.id, messages[0].body, None) return software_deployment_object.SoftwareDeployment.get_by_id( cnxt, sd.id)
def _refresh_zaqar_software_deployment(self, cnxt, sd, deploy_queue_id): rs = db_api.resource_get_by_physical_resource_id(cnxt, sd.id) project = sd.stack_user_project_id queue = self._get_zaqar_queue(cnxt, rs, project, deploy_queue_id) messages = list(queue.pop()) if messages: self.signal_software_deployment(cnxt, sd.id, messages[0].body, None) return software_deployment_object.SoftwareDeployment.get_by_id( cnxt, sd.id)
def _push_metadata_software_deployments(self, cnxt, server_id, stack_user_project_id): rs = db_api.resource_get_by_physical_resource_id(cnxt, server_id) if not rs: return cnxt.session.refresh(rs) if rs.action == resource.Resource.DELETE: return deployments = self.metadata_software_deployments(cnxt, server_id) md = rs.rsrc_metadata or {} md['deployments'] = deployments metadata_put_url = None metadata_queue_id = None metadata_headers = None for rd in rs.data: if rd.key == 'metadata_put_url': metadata_put_url = rd.value if rd.key == 'metadata_queue_id': metadata_queue_id = rd.value if metadata_put_url: data = requests.head(metadata_put_url) etag = data.headers.get('etag') if etag: metadata_headers = {'if-match': etag} else: LOG.warning( "Couldn't find existing Swift metadata " "for server %s", server_id) rows_updated = db_api.resource_update(cnxt, rs.id, {'rsrc_metadata': md}, rs.atomic_key) if not rows_updated: LOG.debug( 'Conflict on deployment metadata update for ' 'server %s; retrying', server_id) action = _('deployments of server %s') % server_id raise exception.ConcurrentTransaction(action=action) LOG.debug('Updated deployment metadata for server %s', server_id) if metadata_put_url: json_md = jsonutils.dumps(md) resp = requests.put(metadata_put_url, json_md, headers=metadata_headers) if resp.status_code == requests.codes.precondition_failed: LOG.debug( 'Conflict on Swift deployment update for ' 'server %s; retrying', server_id) action = _('deployments of server %s') % server_id raise exception.ConcurrentTransaction(action=action) else: try: resp.raise_for_status() except requests.HTTPError as exc: LOG.error( 'Failed to deliver deployment data to ' 'server %s: %s', server_id, exc) if metadata_queue_id: project = stack_user_project_id queue = self._get_zaqar_queue(cnxt, rs, project, metadata_queue_id) zaqar_plugin = cnxt.clients.client_plugin('zaqar') queue.post({'body': md, 'ttl': zaqar_plugin.DEFAULT_TTL})