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")
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"])
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)
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)
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"])
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)
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)
def test_no_holdings(self): holdings = util.get_db_holdings(user=None) self.assertEqual(holdings, {})
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")