Commit 7b2a0f2e authored by Antoine Millet's avatar Antoine Millet
Browse files

Implemented tags on VM objects.

parent ee858385
Loading
Loading
Loading
Loading
+72 −30
Original line number Diff line number Diff line
@@ -298,14 +298,11 @@ class CliHandler(RegisteredCCHandler):
        if tag_name in self.server.RESERVED_TAGS:
            raise ReservedTagError('Tag %r is read-only' % tag_name)

        objects = self.client.list(query, show=('a',), method='addtag')
        objects = self.client.list(query, show=('a', 'p', 'h'), method='addtag')
        errs = Reporter()
        with self.conf:
            for obj in objects:
                if 'a' not in obj:
                    errs.error(obj['id'], 'not an account')
                    continue

                if 'a' in obj:
                    # Update the configuration for this account:
                    tags = self.conf.show(obj['a'])['tags']
                    if tag_name in tags:
@@ -320,6 +317,23 @@ class CliHandler(RegisteredCCHandler):
                        dbobj = self.server.db.get(obj['id'])
                        dbobj.register(StaticTag(tag_name, tag_value), override=True)
                    self.conf.add_tag(obj['a'], tag_name, tag_value)
                elif 'p' in obj:
                    try:
                        hvcon = self.server.get_client(obj['p'])
                    except KeyError:
                        errs.error(obj['id'], 'hypervisor not connected')
                    else:
                        try:
                            hvcon.proxy.tag_add(obj['h'], tag_name, tag_value)
                        except NameError:
                            errs.error(obj['id'], 'hypervisor does not handle tags on VMs')
                        except Exception, err:
                            errs.error(obj['id'], str(err))
                        else:
                            errs.success(obj['id'], 'tag set on VM')
                else:
                    errs.error(obj['id'], 'this object cannot have static tags')
                    continue

        return errs.get_dict()

@@ -334,13 +348,11 @@ class CliHandler(RegisteredCCHandler):
        if tag_name in self.server.RESERVED_TAGS:
            raise ReservedTagError('Tag %r is read-only' % tag_name)

        objects = self.client.list(query, show=('a',), method='deltag')
        objects = self.client.list(query, show=('a', 'p', 'h'), method='deltag')
        errs = Reporter()
        with self.conf:
            for obj in objects:
                if 'a' not in obj:
                    errs.error(obj['id'], 'not an account')
                    continue
                if 'a' in obj:
                    tags = self.conf.show(obj['a'])['tags']
                    if tag_name in tags:
                        errs.success(obj['id'], 'tag deleted')
@@ -349,6 +361,23 @@ class CliHandler(RegisteredCCHandler):
                    else:
                        errs.warn(obj['id'], 'unknown tag')
                    self.server.conf.remove_tag(obj['a'], tag_name)
                elif 'p' in obj:
                    try:
                        hvcon = self.server.get_client(obj['p'])
                    except KeyError:
                        errs.error(obj['id'], 'hypervisor not connected')
                    else:
                        try:
                            hvcon.proxy.tag_delete(obj['h'], tag_name)
                        except NameError:
                            errs.error(obj['id'], 'hypervisor does not handle tags on VMs')
                        except Exception, err:
                            errs.error(obj['id'], str(err))
                        else:
                            errs.success(obj['id'], 'tag deleted on VM')
                else:
                    errs.error(obj['id'], 'this object cannot have static tags')
                    continue

        return errs.get_dict()

@@ -359,7 +388,7 @@ class CliHandler(RegisteredCCHandler):
        :param query: the query to select objects
        """

        objects = self.client.list(query, show=('a',), method='tags')
        objects = self.client.list(query, show=('a', 'p', 'h'), method='tags')
        tags = []
        for obj in objects:
            o = {'id': obj['id']}
@@ -367,6 +396,19 @@ class CliHandler(RegisteredCCHandler):
                otags = self.server.conf.show(obj['a'])['tags']
                otags.update({'id': obj['id']})
                o.update(otags)
            elif 'p' in obj:
                try:
                    hvcon = self.server.get_client(obj['p'])
                except KeyError:
                    pass
                else:
                    try:
                        otags = hvcon.proxy.tag_show(obj['h'])
                    except:
                        self.logger.exception('Unable to get tags, node error')
                    else:
                        otags.update({'id': obj['id']})
                        o.update(otags)
            tags.append(o)
        return {'objects': tags, 'order': ['id']}