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)
Example #2
0
    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)
Example #3
0
    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})
Example #4
0
    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})
Example #5
0
    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})
Example #6
0
 def select_and_update_by_id(cls,
                             context,
                             resource_id,
                             values,
                             expected_engine_id=None,
                             atomic_key=0):
     return db_api.resource_update(context,
                                   resource_id,
                                   values,
                                   atomic_key=atomic_key,
                                   expected_engine_id=expected_engine_id)
Example #7
0
 def select_and_update(self, values, expected_engine_id=None, atomic_key=0):
     return db_api.resource_update(
         self._context, self.id, values, atomic_key=atomic_key, expected_engine_id=expected_engine_id
     )
Example #8
0
 def select_and_update(self, values, expected_engine_id=None, atomic_key=0):
     return db_api.resource_update(self._context,
                                   self.id,
                                   values,
                                   atomic_key=atomic_key,
                                   expected_engine_id=expected_engine_id)
Example #9
0
 def select_and_update_by_id(cls, context, resource_id,
                             values, expected_engine_id=None,
                             atomic_key=0):
     return db_api.resource_update(context, resource_id, values,
                                   atomic_key=atomic_key,
                                   expected_engine_id=expected_engine_id)
Example #10
0
    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})