def handle(self, *args, **options):
        write = self.stderr.write
        userid = options['userid']
        project = options["project"]

        # Get holdings from Cyclades DB
        db_holdings = util.get_db_holdings(user=userid, project=project)
        db_project_holdings = util.get_db_holdings(project=project,
                                                   for_users=False)

        # Get holdings from QuotaHolder
        try:
            qh_holdings = util.get_qh_users_holdings(
                [userid] if userid is not None else None,
                [project] if project is not None else None)
            qh_project_holdings = util.get_qh_project_holdings(
                [project] if project is not None else None)
        except errors.AstakosClientException as e:
            raise CommandError(e)

        unsynced_users, users_pending, users_unknown =\
            reconcile.check_users(self.stderr, quotas.RESOURCES,
                                  db_holdings, qh_holdings)

        unsynced_projects, projects_pending, projects_unknown =\
            reconcile.check_projects(self.stderr, quotas.RESOURCES,
                                     db_project_holdings, qh_project_holdings)
        pending_exists = users_pending or projects_pending
        unknown_exists = users_unknown or projects_unknown

        headers = ("Type", "Holder", "Source", "Resource",
                   "Database", "Quotaholder")
        unsynced = unsynced_users + unsynced_projects
        if unsynced:
            pprint_table(self.stdout, unsynced, headers)
            if options["fix"]:
                qh = quotas.Quotaholder.get()
                force = options["force"]
                name = ("client: reconcile-resources-cyclades, time: %s"
                        % datetime.now())
                user_provisions = reconcile.create_user_provisions(
                    unsynced_users)
                project_provisions = reconcile.create_project_provisions(
                    unsynced_projects)
                try:
                    qh.issue_commission_generic(
                        user_provisions, project_provisions,
                        name=name, force=force,
                        auto_accept=True)
                except quotas.errors.QuotaLimit:
                    write("Reconciling failed because a limit has been "
                          "reached. Use --force to ignore the check.\n")
                    return
                write("Fixed unsynced resources\n")

        if pending_exists:
            write("Found pending commissions. Run 'snf-manage"
                  " reconcile-commissions-cyclades'\n")
        elif not (unsynced or unknown_exists):
            write("Everything in sync.\n")
Пример #2
0
 def test_network_holdings(self):
     mfactory.NetworkFactory(userid="user1")
     mfactory.NetworkFactory(userid="user2")
     user_holdings = {"user2": {"user2": {"cyclades.network.private": 1}}}
     holdings = util.get_db_holdings(user="******")
     self.assertEqual(holdings, user_holdings)
     holdings = util.get_db_holdings()
     self.assertEqual(holdings["user2"], user_holdings["user2"])
Пример #3
0
 def test_network_holdings(self):
     mfactory.NetworkFactory(userid="user1")
     mfactory.NetworkFactory(userid="user2")
     user_holdings = {"user2": {"user2": {"cyclades.network.private": 1}}}
     holdings = util.get_db_holdings(user="******")
     self.assertEqual(holdings, user_holdings)
     holdings = util.get_db_holdings()
     self.assertEqual(holdings["user2"], user_holdings["user2"])
Пример #4
0
 def test_vm_holdings(self):
     flavor = mfactory.FlavorFactory(cpu=24, ram=8192, disk=20)
     mfactory.VirtualMachineFactory(userid="user1", deleted=True)
     mfactory.VirtualMachineFactory(flavor=flavor,
                                    userid="user1",
                                    operstate="BUILD")
     mfactory.VolumeFactory(userid="user1", size=20, machine=None)
     user_holdings = {
         "user1": {
             "user1": {
                 "cyclades.vm": 1,
                 "cyclades.total_cpu": 24,
                 "cyclades.cpu": 24,
                 "cyclades.disk": 20 << 30,
                 "cyclades.total_ram": 8192 << 20,
                 "cyclades.ram": 8192 << 20
             }
         }
     }
     holdings = util.get_db_holdings(user="******")
     self.assertEqual(holdings, user_holdings)
     holdings = util.get_db_holdings()
     self.assertEqual(holdings["user1"], user_holdings["user1"])
     mfactory.VirtualMachineFactory(flavor=flavor, userid="user1")
     ##
     mfactory.VirtualMachineFactory(flavor=flavor,
                                    userid="user2",
                                    operstate="STARTED")
     mfactory.VolumeFactory(userid="user2", size=30, machine=None)
     user_holdings = {
         "user2": {
             "user2": {
                 "cyclades.vm": 1,
                 "cyclades.total_cpu": 24,
                 "cyclades.cpu": 24,
                 "cyclades.disk": 30 << 30,
                 "cyclades.total_ram": 8192 << 20,
                 "cyclades.ram": 8192 << 20
             }
         }
     }
     holdings = util.get_db_holdings(user="******")
     self.assertEqual(holdings, user_holdings)
     mfactory.VirtualMachineFactory(flavor=flavor,
                                    userid="user3",
                                    operstate="STOPPED")
     user_holdings = {
         "user3": {
             "user3": {
                 "cyclades.vm": 1,
                 "cyclades.total_cpu": 24,
                 "cyclades.total_ram": 8589934592
             }
         }
     }
     holdings = util.get_db_holdings(user="******")
     self.assertEqual(holdings, user_holdings)
Пример #5
0
 def test_vm_holdings(self):
     flavor = mfactory.FlavorFactory(cpu=24,
                                     ram=8192,
                                     disk=20,
                                     disk_template='drbd')
     mfactory.VirtualMachineFactory()
     mfactory.VirtualMachineFactory(flavor=flavor,
                                    userid="user1",
                                    operstate="BUILD")
     user_holdings = {
         "user1": {
             "cyclades.vm": 1,
             "cyclades.total_cpu": 24,
             "cyclades.cpu": 24,
             "cyclades.disk": 21474836480,
             "cyclades.total_ram": 8589934592,
             "cyclades.ram": 8589934592
         }
     }
     holdings = util.get_db_holdings(user="******")
     self.assertEqual(holdings, user_holdings)
     holdings = util.get_db_holdings()
     self.assertEqual(holdings["user1"], user_holdings["user1"])
     mfactory.VirtualMachineFactory(flavor=flavor, userid="user1")
     ##
     mfactory.VirtualMachineFactory(flavor=flavor,
                                    userid="user2",
                                    operstate="STARTED")
     user_holdings = {
         "user2": {
             "cyclades.vm": 1,
             "cyclades.total_cpu": 24,
             "cyclades.cpu": 24,
             "cyclades.disk": 21474836480,
             "cyclades.total_ram": 8589934592,
             "cyclades.ram": 8589934592
         }
     }
     holdings = util.get_db_holdings(user="******")
     self.assertEqual(holdings, user_holdings)
     mfactory.VirtualMachineFactory(flavor=flavor,
                                    userid="user3",
                                    operstate="STOPPED")
     user_holdings = {
         "user3": {
             "cyclades.vm": 1,
             "cyclades.total_cpu": 24,
             "cyclades.disk": 21474836480,
             "cyclades.total_ram": 8589934592
         }
     }
     holdings = util.get_db_holdings(user="******")
     self.assertEqual(holdings, user_holdings)
Пример #6
0
 def test_vm_holdings(self):
     flavor = mfactory.FlavorFactory(cpu=24, ram=8192, disk=20,
                               disk_template='drbd')
     mfactory.VirtualMachineFactory()
     mfactory.VirtualMachineFactory(flavor=flavor, userid="user1")
     user_holdings = {"user1": {"cyclades.vm": 1,
                                "cyclades.cpu": 24,
                                "cyclades.disk": 21474836480,
                                "cyclades.ram": 8589934592}}
     holdings = util.get_db_holdings(user="******")
     self.assertEqual(holdings, user_holdings)
     holdings = util.get_db_holdings()
     self.assertEqual(holdings["user1"], user_holdings["user1"])
Пример #7
0
 def test_floating_ip_holdings(self):
     mfactory.IPv4AddressFactory(userid="user1", floating_ip=True)
     mfactory.IPv4AddressFactory(userid="user1", floating_ip=True)
     mfactory.IPv4AddressFactory(userid="user2", floating_ip=True)
     mfactory.IPv4AddressFactory(userid="user3", floating_ip=True)
     holdings = util.get_db_holdings()
     self.assertEqual(holdings["user1"]["user1"]["cyclades.floating_ip"], 2)
     self.assertEqual(holdings["user2"]["user2"]["cyclades.floating_ip"], 1)
     self.assertEqual(holdings["user3"]["user3"]["cyclades.floating_ip"], 1)
Пример #8
0
 def test_floating_ip_holdings(self):
     mfactory.IPv4AddressFactory(userid="user1", floating_ip=True)
     mfactory.IPv4AddressFactory(userid="user1", floating_ip=True)
     mfactory.IPv4AddressFactory(userid="user2", floating_ip=True)
     mfactory.IPv4AddressFactory(userid="user3", floating_ip=True)
     holdings = util.get_db_holdings()
     self.assertEqual(holdings["user1"]["user1"]["cyclades.floating_ip"], 2)
     self.assertEqual(holdings["user2"]["user2"]["cyclades.floating_ip"], 1)
     self.assertEqual(holdings["user3"]["user3"]["cyclades.floating_ip"], 1)
Пример #9
0
 def test_vm_holdings(self):
     flavor = mfactory.FlavorFactory(cpu=24, ram=8192, disk=20)
     mfactory.VirtualMachineFactory(userid="user1", deleted=True)
     mfactory.VirtualMachineFactory(flavor=flavor, userid="user1",
                                    operstate="BUILD")
     mfactory.VolumeFactory(userid="user1", size=20, machine=None)
     user_holdings = {"user1": {"user1": {"cyclades.vm": 1,
                                          "cyclades.total_cpu": 24,
                                          "cyclades.cpu": 24,
                                          "cyclades.disk": 20 << 30,
                                          "cyclades.total_ram": 8192 << 20,
                                          "cyclades.ram": 8192 << 20}}}
     holdings = util.get_db_holdings(user="******")
     self.assertEqual(holdings, user_holdings)
     holdings = util.get_db_holdings()
     self.assertEqual(holdings["user1"], user_holdings["user1"])
     mfactory.VirtualMachineFactory(flavor=flavor, userid="user1")
     ##
     mfactory.VirtualMachineFactory(flavor=flavor, userid="user2",
                                    operstate="STARTED")
     mfactory.VolumeFactory(userid="user2", size=30, machine=None)
     user_holdings = {"user2": {"user2": {"cyclades.vm": 1,
                                          "cyclades.total_cpu": 24,
                                          "cyclades.cpu": 24,
                                          "cyclades.disk": 30 << 30,
                                          "cyclades.total_ram": 8192 << 20,
                                          "cyclades.ram": 8192 << 20}}}
     holdings = util.get_db_holdings(user="******")
     self.assertEqual(holdings, user_holdings)
     mfactory.VirtualMachineFactory(flavor=flavor, userid="user3",
                                    operstate="STOPPED")
     user_holdings = {"user3": {"user3": {"cyclades.vm": 1,
                                          "cyclades.total_cpu": 24,
                                          "cyclades.total_ram": 8589934592}}
                      }
     holdings = util.get_db_holdings(user="******")
     self.assertEqual(holdings, user_holdings)
Пример #10
0
 def test_no_holdings(self):
     holdings = util.get_db_holdings(user=None)
     self.assertEqual(holdings, {})
Пример #11
0
 def test_no_holdings(self):
     holdings = util.get_db_holdings(user=None)
     self.assertEqual(holdings, {})
Пример #12
0
    def handle(self, *args, **options):
        write = self.stdout.write
        userid = options['userid']

        # Get holdings from Cyclades DB
        db_holdings = get_db_holdings(userid)
        # Get holdings from QuotaHolder
        qh_holdings = get_quotaholder_holdings(userid)

        users = set(db_holdings.keys())
        users.update(qh_holdings.keys())
        # Remove 'None' user
        users.discard(None)

        if userid and userid not in users:
            write("User '%s' does not exist in Quotaholder!", userid)
            return

        pending_exists = False
        unknown_user_exists = False
        unsynced = []
        for user in users:
            db = db_holdings.get(user, {})
            try:
                qh_all = qh_holdings[user]
            except KeyError:
                write("User '%s' does not exist in Quotaholder!\n" %
                      user)
                unknown_user_exists = True
                continue

            # Assuming only one source
            qh = qh_all.get(quotas.DEFAULT_SOURCE, {})
            qh = transform_quotas(qh)
            for resource in quotas.RESOURCES:
                db_value = db.pop(resource, 0)
                try:
                    qh_value, _, qh_pending = qh[resource]
                except KeyError:
                    write("Resource '%s' does not exist in Quotaholder"
                          " for user '%s'!\n" % (resource, user))
                    continue
                if qh_pending:
                    write("Pending commission. User '%s', resource '%s'.\n" %
                          (user, resource))
                    pending_exists = True
                    continue
                if db_value != qh_value:
                    data = (user, resource, db_value, qh_value)
                    unsynced.append(data)

        headers = ("User", "Resource", "Database", "Quotaholder")
        if unsynced:
            pprint_table(self.stderr, unsynced, headers)
            if options["fix"]:
                qh = quotas.Quotaholder.get()
                request = {}
                request["force"] = options["force"]
                request["auto_accept"] = True
                request["name"] = "RECONCILE"
                request["provisions"] = map(create_provision, unsynced)
                try:
                    qh.issue_commission(ASTAKOS_TOKEN, request)
                except quotas.QuotaLimit:
                    write("Reconciling failed because a limit has been "
                          "reached. Use --force to ignore the check.\n")
                    return
                write("Fixed unsynced resources\n")

        if pending_exists:
            write("Found pending commissions. Run 'snf-manage"
                  " reconcile-commissions-cyclades'\n")
        elif not (unsynced or unknown_user_exists):
            write("Everything in sync.\n")
    def handle(self, *args, **options):
        write = self.stderr.write
        userid = options['userid']
        project = options["project"]

        # Get holdings from Cyclades DB
        db_holdings = util.get_db_holdings(user=userid, project=project)
        db_project_holdings = util.get_db_holdings(project=project,
                                                   for_users=False)

        # Get holdings from QuotaHolder
        try:
            qh_holdings = util.get_qh_users_holdings(
                [userid] if userid is not None else None,
                [project] if project is not None else None)
            qh_project_holdings = util.get_qh_project_holdings(
                [project] if project is not None else None)
        except errors.AstakosClientException as e:
            raise CommandError(e)

        unsynced_users, users_pending, users_unknown =\
            reconcile.check_users(self.stderr, quotas.RESOURCES,
                                  db_holdings, qh_holdings)

        unsynced_projects, projects_pending, projects_unknown =\
            reconcile.check_projects(self.stderr, quotas.RESOURCES,
                                     db_project_holdings, qh_project_holdings)
        pending_exists = users_pending or projects_pending
        unknown_exists = users_unknown or projects_unknown

        headers = ("Type", "Holder", "Source", "Resource", "Database",
                   "Quotaholder")
        unsynced = unsynced_users + unsynced_projects
        if unsynced:
            pprint_table(self.stdout, unsynced, headers)
            if options["fix"]:
                qh = quotas.Quotaholder.get()
                force = options["force"]
                name = ("client: reconcile-resources-cyclades, time: %s" %
                        datetime.now())
                user_provisions = reconcile.create_user_provisions(
                    unsynced_users)
                project_provisions = reconcile.create_project_provisions(
                    unsynced_projects)
                try:
                    qh.issue_commission_generic(user_provisions,
                                                project_provisions,
                                                name=name,
                                                force=force,
                                                auto_accept=True)
                except quotas.errors.QuotaLimit:
                    write("Reconciling failed because a limit has been "
                          "reached. Use --force to ignore the check.\n")
                    return
                write("Fixed unsynced resources\n")

        if pending_exists:
            write("Found pending commissions. Run 'snf-manage"
                  " reconcile-commissions-cyclades'\n")
        elif not (unsynced or unknown_exists):
            write("Everything in sync.\n")