コード例 #1
0
class TestNewVirtualMachineFormInit(TestCase, VirtualMachineTestCaseMixin):
    def setUp(self):
        self.user = User(id=67, username='******')
        self.user.set_password('secret')
        self.user.save()
        self.user1 = User(id=70, username='******')
        self.user1.set_password('secret')
        self.user1.save()
        self.group = Group(id=45, name='testing_group')
        self.group.save()

        models.client.GanetiRapiClient = RapiProxy
        self.cluster0 = Cluster.objects.create(hostname='test0', slug='test0')
        self.cluster1 = Cluster.objects.create(hostname='test1', slug='test1')
        self.cluster2 = Cluster.objects.create(hostname='test2', slug='test2')
        self.cluster3 = Cluster.objects.create(hostname='test3', slug='test3')
        self.cluster0.sync_nodes()

        # Give each cluster write permissions, and set it's info
        for cluster in (self.cluster0, self.cluster1, self.cluster2,
                        self.cluster3):
            cluster.username = self.user.username
            cluster.password = '******'
            cluster.info = INFO
            cluster.save()

    def tearDown(self):
        User.objects.all().delete()
        Group.objects.all().delete()
        VirtualMachine.objects.all().delete()
        Cluster.objects.all().delete()

    def test_default_choices(self):
        """
        Test that ChoiceFields have the correct default options
        """
        form = NewVirtualMachineForm(self.user)
        self.assertEqual([(u'', u'---------')],
                         form.fields['nic_type'].choices)
        self.assertEqual([(u'', u'---------'), (u'routed', u'routed'),
                          (u'bridged', u'bridged')],
                         form.fields['nic_mode_0'].choices)
        self.assertEqual([(u'', u'---------')],
                         form.fields['boot_order'].choices)
        self.assertEqual([(u'', u'---------'), (u'plain', u'plain'),
                          (u'drbd', u'drbd'), (u'file', u'file'),
                          (u'diskless', u'diskless')],
                         form.fields['disk_template'].choices)

    def test_init_and_data_params(self):
        """
        Tests that passing initial does not trigger validation

        Verifies:
            * Passing data (arg[0]) will trigger validation
            * Passing initial will not trigger validation
        """
        form = NewVirtualMachineForm(self.user, initial={})
        self.assertEqual({}, form.errors)

        form = NewVirtualMachineForm(self.user, {})
        self.assertNotEqual({}, form.errors)

    def test_cluster_init(self):
        """
        Tests initializing a form with a Cluster

        Verifies:
            * cluster choices are set correctly
            * node choices are set correctly
        """

        # no cluster
        form = NewVirtualMachineForm(self.user)
        self.assertEqual([(u'', u'---------')], form.fields['pnode'].choices)
        self.assertEqual([(u'', u'---------')], form.fields['snode'].choices)
        self.assertEqual([(u'', u'---------')], form.fields['os'].choices)

        # cluster from initial data
        form = NewVirtualMachineForm(self.user, {'cluster': self.cluster0.id})
        self.assertEqual(
            set([(u'', u'---------'),
                 (u'gtest1.example.bak', u'gtest1.example.bak'),
                 (u'gtest2.example.bak', u'gtest2.example.bak'),
                 (u'gtest3.example.bak', u'gtest3.example.bak')]),
            set(form.fields['pnode'].choices))
        self.assertEqual(
            set([(u'', u'---------'),
                 (u'gtest1.example.bak', u'gtest1.example.bak'),
                 (u'gtest2.example.bak', u'gtest2.example.bak'),
                 (u'gtest3.example.bak', u'gtest3.example.bak')]),
            set(form.fields['snode'].choices))
        self.assertEqual(form.fields['os'].choices,
                         [(u'', u'---------'),
                          ('Image', [('image+debian-osgeo', 'Debian Osgeo'),
                                     ('image+ubuntu-lucid', 'Ubuntu Lucid')])])

        # cluster from initial data
        form = NewVirtualMachineForm(self.user, {'cluster': self.cluster0.id})
        self.assertEqual(
            set([(u'', u'---------'),
                 (u'gtest1.example.bak', u'gtest1.example.bak'),
                 (u'gtest2.example.bak', u'gtest2.example.bak'),
                 (u'gtest3.example.bak', u'gtest3.example.bak')]),
            set(form.fields['pnode'].choices))
        self.assertEqual(
            set([(u'', u'---------'),
                 (u'gtest1.example.bak', u'gtest1.example.bak'),
                 (u'gtest2.example.bak', u'gtest2.example.bak'),
                 (u'gtest3.example.bak', u'gtest3.example.bak')]),
            set(form.fields['snode'].choices))
        self.assertEqual(form.fields['os'].choices,
                         [(u'', u'---------'),
                          ('Image', [('image+debian-osgeo', 'Debian Osgeo'),
                                     ('image+ubuntu-lucid', 'Ubuntu Lucid')])])

    def test_cluster_choices_init(self):
        """
        Tests that cluster choices are based on User permissions

        Verifies:
            * superusers have all Clusters as choices
            * if owner is set, only display clusters the owner has permissions
              directly on.  This includes both users and groups
            * if no owner is set, choices include clusters that the user has
              permission directly on, or through a group
        """

        # no owner, no permissions
        form = NewVirtualMachineForm(self.user)
        self.assertEqual(set([(u'', u'---------')]),
                         set(form.fields['cluster'].choices))

        # no owner, group and direct permissions
        self.user.grant('admin', self.cluster0)
        self.user.grant('create_vm', self.cluster1)
        self.group.grant('admin', self.cluster2)
        self.group.user_set.add(self.user)
        self.assertEqual(
            set([(u'', u'---------'), (self.cluster0.pk, u'test0'),
                 (self.cluster1.pk, u'test1'), (self.cluster2.pk, u'test2')]),
            set(form.fields['cluster'].choices))
        self.user.revoke_all(self.cluster0)
        self.user.revoke_all(self.cluster1)
        self.group.revoke_all(self.cluster2)

        # owner, user with no choices
        form = NewVirtualMachineForm(
            self.user, initial={'owner': self.user.get_profile().id})
        self.assertEqual(set([(u'', u'---------')]),
                         set(form.fields['cluster'].choices))

        # owner, user with choices
        self.user.grant('admin', self.cluster0)
        self.user.grant('create_vm', self.cluster1)
        form = NewVirtualMachineForm(
            self.user, initial={'owner': self.user.get_profile().id})
        self.assertEqual(
            set([(u'', u'---------'), (self.cluster0.pk, u'test0'),
                 (self.cluster1.pk, u'test1')]),
            set(form.fields['cluster'].choices))

        # owner, group with no choices
        form = NewVirtualMachineForm(
            self.user, initial={'owner': self.group.organization.id})
        self.assertEqual(set([(u'', u'---------')]),
                         set(form.fields['cluster'].choices))

        # owner, group with choices
        self.group.grant('admin', self.cluster2)
        self.group.grant('create_vm', self.cluster3)
        form = NewVirtualMachineForm(
            self.user, initial={'owner': self.group.organization.id})
        self.assertEqual(
            set([(u'', u'---------'), (self.cluster2.pk, u'test2'),
                 (self.cluster3.pk, u'test3')]),
            set(form.fields['cluster'].choices))

        # user - superuser
        self.user.is_superuser = True
        self.user.save()
        form = NewVirtualMachineForm(
            self.user, initial={'owner': self.user.get_profile().id})
        self.assertEqual(
            set([(u'', u'---------'), (self.cluster0.pk, u'test0'),
                 (self.cluster1.pk, u'test1'), (self.cluster2.pk, u'test2'),
                 (self.cluster3.pk, u'test3')]),
            set(form.fields['cluster'].choices))

        # group - superuser
        form = NewVirtualMachineForm(
            self.user, initial={'owner': self.group.organization.id})
        self.assertEqual(
            set([(u'', u'---------'), (self.cluster0.pk, u'test0'),
                 (self.cluster1.pk, u'test1'), (self.cluster2.pk, u'test2'),
                 (self.cluster3.pk, u'test3')]),
            set(form.fields['cluster'].choices))

    def test_owner_choices_init(self):
        """
        Tests that owner choices are set based on User permissions

        Verifies:
            * superusers have all clusterusers as choices
            * user receives themselves as a choice if they have perms
            * user receives all groups they are a member of
        """

        # user with no choices
        form = NewVirtualMachineForm(self.user)
        self.assertEqual([(u'', u'---------')], form.fields['owner'].choices)

        # user with perms on self, no groups
        self.user.grant('admin', self.cluster0)
        form = NewVirtualMachineForm(self.user)
        self.assertEqual([
            (u'', u'---------'),
            (self.user.profile.id, u'tester0'),
        ], form.fields['owner'].choices)
        self.user.set_perms(['create_vm'], self.cluster0)
        form = NewVirtualMachineForm(self.user)
        self.assertEqual([
            (u'', u'---------'),
            (self.user.profile.id, u'tester0'),
        ], form.fields['owner'].choices)

        # user with perms on self and groups
        self.group.user_set.add(self.user)
        self.group.grant('admin', self.cluster0)
        form = NewVirtualMachineForm(self.user)
        self.assertEqual([
            (u'', u'---------'),
            (self.group.organization.id, u'testing_group'),
            (self.user.profile.id, u'tester0'),
        ], form.fields['owner'].choices)
        self.user.revoke_all(self.cluster0)

        # user with no perms on self, but groups
        form = NewVirtualMachineForm(self.user)
        self.assertEqual([
            (u'', u'---------'),
            (self.group.organization.id, u'testing_group'),
        ], form.fields['owner'].choices)
        self.group.set_perms(['create_vm'], self.cluster0)
        form = NewVirtualMachineForm(self.user)
        self.assertEqual([
            (u'', u'---------'),
            (self.group.organization.id, u'testing_group'),
        ], form.fields['owner'].choices)
        self.group.revoke_all(self.cluster0)

        # superuser
        self.user.is_superuser = True
        self.user.save()
        form = NewVirtualMachineForm(self.user)
        self.assertEqual([
            (u'', u'---------'),
            (self.user.profile.id, u'tester0'),
            (self.user1.profile.id, u'tester1'),
            (self.group.organization.id, u'testing_group'),
        ], list(form.fields['owner'].choices))

    def test_default_disks(self):
        self.user.grant('admin', self.cluster0)
        form = NewVirtualMachineForm(self.user)
        self.assertTrue('disk_size_0' in form.fields)
        self.assertFalse('disk_size_1' in form.fields)

    def test_no_disks(self):
        self.user.grant('admin', self.cluster0)
        form = NewVirtualMachineForm(self.user, dict(disk_count=0))
        self.assertFalse('disk_size_0' in form.fields)
        self.assertFalse('disk_size_1' in form.fields)

    def test_single_disk(self):
        self.user.grant('admin', self.cluster0)
        form = NewVirtualMachineForm(self.user, dict(disk_count=1))
        self.assertTrue('disk_size_0' in form.fields)
        self.assertFalse('disk_size_1' in form.fields)

    def test_multiple_disks(self):
        self.user.grant('admin', self.cluster0)
        form = NewVirtualMachineForm(self.user, dict(disk_count=2))
        self.assertTrue('disk_size_0' in form.fields)
        self.assertTrue('disk_size_1' in form.fields)

    def test_multiple_disks_from_dict(self):
        self.user.grant('admin', self.cluster0)
        initial = dict(disks=[dict(size=123), dict(size=456)])
        form = NewVirtualMachineForm(self.user, initial)
        self.assertTrue('disk_size_0' in form.fields)
        self.assertTrue('disk_size_1' in form.fields)

        data = form.data
        self.assertEqual(2, data['disk_count'])
        self.assertEqual(123, data['disk_size_0'])
        self.assertEqual(456, data['disk_size_1'])

    def test_default_nics(self):
        self.user.grant('admin', self.cluster0)
        form = NewVirtualMachineForm(self.user)
        self.assertTrue('nic_mode_0' in form.fields)
        self.assertFalse('nic_mode_1' in form.fields)
        self.assertTrue('nic_link_0' in form.fields)
        self.assertFalse('nic_link_1' in form.fields)

    def test_no_nics(self):
        self.user.grant('admin', self.cluster0)
        form = NewVirtualMachineForm(self.user, dict(nic_count=0))
        self.assertFalse('nic_mode_0' in form.fields)
        self.assertFalse('nic_mode_1' in form.fields)
        self.assertFalse('nic_link_0' in form.fields)
        self.assertFalse('nic_link_1' in form.fields)

    def test_single_nic(self):
        self.user.grant('admin', self.cluster0)
        form = NewVirtualMachineForm(self.user, dict(nic_count=1))
        self.assertTrue('nic_mode_0' in form.fields)
        self.assertFalse('nic_mode_1' in form.fields)
        self.assertTrue('nic_link_0' in form.fields)
        self.assertFalse('nic_link_1' in form.fields)

    def test_multiple_nics(self):
        self.user.grant('admin', self.cluster0)
        form = NewVirtualMachineForm(self.user, dict(nic_count=2))
        self.assertTrue('nic_mode_0' in form.fields)
        self.assertTrue('nic_mode_1' in form.fields)
        self.assertTrue('nic_link_0' in form.fields)
        self.assertTrue('nic_link_1' in form.fields)

    def test_multiple_nics_from_dict(self):
        self.user.grant('admin', self.cluster0)
        initial = dict(
            nics=[dict(mode=123, link='br0'),
                  dict(mode=456, link='br1')])
        form = NewVirtualMachineForm(self.user, initial)
        self.assertTrue('nic_mode_0' in form.fields)
        self.assertTrue('nic_mode_1' in form.fields)
        self.assertTrue('nic_link_0' in form.fields)
        self.assertTrue('nic_link_1' in form.fields)

        data = form.data
        self.assertEqual(2, data['nic_count'])
        self.assertEqual(123, data['nic_mode_0'])
        self.assertEqual(456, data['nic_mode_1'])
        self.assertEqual('br0', data['nic_link_0'])
        self.assertEqual('br1', data['nic_link_1'])
コード例 #2
0
# create admin group
admin_group = None
try:
    admin_group = Group.objects.get(name='admin')
except ObjectDoesNotExist:
    admin_group = Group(name='admin')
    admin_group.save()

admin_group.user_set.add(admin_user)

# create everyone group
everyone_group = None
try:
    everyone_group = Group.objects.get(name="everyone")
except ObjectDoesNotExist:
    everyone_group = Group(name='everyone')
    everyone_group.save()

everyone_group.user_set.add(admin_user)

# grant permission of data node
root_node = TreeNode.objects.get(id=1)
everyone_group.grant(PermissionConstants.READ, root_node)
everyone_group.grant(PermissionConstants.WRITE, root_node)
admin_user.grant(PermissionConstants.READ, root_node)
admin_user.grant(PermissionConstants.WRITE, root_node)
admin_group.grant(PermissionConstants.READ, root_node)
admin_group.grant(PermissionConstants.WRITE, root_node)

print "\neverything is done successfully\n"
コード例 #3
0
    def test_view_cluster_choices(self):
        """
        Test retrieving list of clusters a user or usergroup has access to
        """
        url = '/vm/add/choices/'
        Cluster.objects.all().delete()
        cluster0 = Cluster(hostname='user.create_vm', slug='user_create_vm')
        cluster0.save()
        cluster1 = Cluster(hostname='user.admin', slug='user_admin')
        cluster1.save()
        cluster2 = Cluster(hostname='superuser', slug='superuser')
        cluster2.save()
        cluster3 = Cluster(hostname='group.create_vm', slug='group_create_vm')
        cluster3.save()
        cluster4 = Cluster(hostname='group.admin', slug='group_admin')
        cluster4.save()
        cluster5 = Cluster(hostname='no.perms.on.this.group', slug='no_perms')
        cluster5.save()
        # cluster ids are 1 through 6

        # Set each cluster info and update
        for cluster in (cluster0, cluster1, cluster2, cluster3, cluster4,
                        cluster5):
            cluster.username = self.user.username
            cluster.password = '******'
            cluster.info = INFO
            cluster.save()

        self.group.user_set.add(self.user)
        group1 = Group(id=43, name='testing_group2')
        group1.save()
        group1.grant('admin', cluster5)

        # anonymous user
        response = self.c.get(url, follow=True)
        self.assertEqual(200, response.status_code)
        self.assertTemplateUsed(response, 'registration/login.html')

        self.assertTrue(
            self.c.login(username=self.user.username, password='******'))

        # Invalid ClusterUser
        response = self.c.get(url, {'clusteruser_id': -1})
        self.assertEqual(404, response.status_code)

        # create_vm permission through a group
        self.group.grant('create_vm', cluster3)
        response = self.c.get(url,
                              {'clusteruser_id': self.group.organization.id})
        self.assertEqual(200, response.status_code)
        clusters = json.loads(response.content)
        self.assertTrue([cluster3.id, 'group.create_vm'] in clusters)
        self.assertEqual(1, len(clusters))

        # admin permission through a group
        self.group.grant('admin', cluster4)
        response = self.c.get(url,
                              {'clusteruser_id': self.group.organization.id})
        self.assertEqual(200, response.status_code)
        clusters = json.loads(response.content)
        self.assertTrue([cluster3.id, 'group.create_vm'] in clusters)
        self.assertTrue([cluster4.id, 'group.admin'] in clusters)
        self.assertEqual(2, len(clusters))

        # create_vm permission on the user
        self.user.grant('create_vm', cluster0)
        response = self.c.get(url)
        self.assertEqual(200, response.status_code)
        clusters = json.loads(response.content)
        self.assertTrue([cluster0.id, 'user.create_vm'] in clusters)
        self.assertEqual(1, len(clusters), clusters)

        # admin permission on the user
        self.user.grant('admin', cluster1)
        response = self.c.get(url)
        self.assertEqual(200, response.status_code)
        clusters = json.loads(response.content)
        self.assertTrue([cluster0.id, 'user.create_vm'] in clusters)
        self.assertTrue([cluster1.id, 'user.admin'] in clusters)
        self.assertEqual(2, len(clusters))

        # Superusers see everything
        self.user.is_superuser = True
        self.user.save()
        response = self.c.get(url)
        self.assertEqual(200, response.status_code)
        self.assertEqual('application/json', response['content-type'])
        clusters = json.loads(response.content)
        self.assertTrue([cluster0.id, 'user.create_vm'] in clusters)
        self.assertTrue([cluster1.id, 'user.admin'] in clusters)
        self.assertTrue([cluster2.id, 'superuser'] in clusters, clusters)
        self.assertTrue([cluster3.id, 'group.create_vm'] in clusters)
        self.assertTrue([cluster4.id, 'group.admin'] in clusters, clusters)
        self.assertTrue([cluster5.id, 'no.perms.on.this.group'] in clusters)
        self.assertEqual(6, len(clusters))
コード例 #4
0
ファイル: helpers.py プロジェクト: bsu/GWM2
    def test_view_cluster_choices(self):
        """
        Test retrieving list of clusters a user or usergroup has access to
        """
        url = '/vm/add/choices/'
        Cluster.objects.all().delete()
        cluster0 = Cluster(hostname='user.create_vm', slug='user_create_vm')
        cluster0.save()
        cluster1 = Cluster(hostname='user.admin', slug='user_admin')
        cluster1.save()
        cluster2 = Cluster(hostname='superuser', slug='superuser')
        cluster2.save()
        cluster3 = Cluster(hostname='group.create_vm', slug='group_create_vm')
        cluster3.save()
        cluster4 = Cluster(hostname='group.admin', slug='group_admin')
        cluster4.save()
        cluster5 = Cluster(hostname='no.perms.on.this.group', slug='no_perms')
        cluster5.save()
        # cluster ids are 1 through 6

        group.user_set.add(user)
        group1 = Group(id=43, name='testing_group2')
        group1.save()
        group1.grant('admin',cluster5)

        # anonymous user
        response = c.get(url, follow=True)
        self.assertEqual(200, response.status_code)
        self.assertTemplateUsed(response, 'registration/login.html')

        self.assertTrue(c.login(username=user.username, password='******'))

        # Invalid ClusterUser
        response = c.get(url, {'clusteruser_id':-1})
        self.assertEqual(404, response.status_code)

        # create_vm permission through a group
        group.grant('create_vm', cluster3)
        response = c.get(url, {'clusteruser_id': group.organization.id})
        self.assertEqual(200, response.status_code)
        clusters = json.loads(response.content)
        self.assertTrue([cluster3.id,'group.create_vm'] in clusters)
        self.assertEqual(1, len(clusters))

        # admin permission through a group
        group.grant('admin', cluster4)
        response = c.get(url, {'clusteruser_id': group.organization.id})
        self.assertEqual(200, response.status_code)
        clusters = json.loads(response.content)
        self.assertTrue([cluster3.id,'group.create_vm'] in clusters)
        self.assertTrue([cluster4.id,'group.admin'] in clusters)
        self.assertEqual(2, len(clusters))

        # create_vm permission on the user
        user.grant('create_vm', cluster0)
        response = c.get(url)
        self.assertEqual(200, response.status_code)
        clusters = json.loads(response.content)
        self.assertTrue([cluster0.id,'user.create_vm'] in clusters)
        self.assertEqual(1, len(clusters), clusters)

        # admin permission on the user
        user.grant('admin', cluster1)
        response = c.get(url)
        self.assertEqual(200, response.status_code)
        clusters = json.loads(response.content)
        self.assertTrue([cluster0.id,'user.create_vm'] in clusters)
        self.assertTrue([cluster1.id,'user.admin'] in clusters)
        self.assertEqual(2, len(clusters))

        # Superusers see everything
        user.is_superuser = True
        user.save()
        response = c.get(url)
        self.assertEqual(200, response.status_code)
        self.assertEqual('application/json', response['content-type'])
        clusters = json.loads(response.content)
        self.assertTrue([cluster0.id,'user.create_vm'] in clusters)
        self.assertTrue([cluster1.id,'user.admin'] in clusters)
        self.assertTrue([cluster2.id,'superuser'] in clusters, clusters)
        self.assertTrue([cluster3.id,'group.create_vm'] in clusters)
        self.assertTrue([cluster4.id,'group.admin'] in clusters, clusters)
        self.assertTrue([cluster5.id,'no.perms.on.this.group'] in clusters)
        self.assertEqual(6, len(clusters))
コード例 #5
0
ファイル: create.py プロジェクト: bramwelt/ganeti_webmgr
class TestNewVirtualMachineFormInit(TestCase, VirtualMachineTestCaseMixin):

    def setUp(self):
        self.user = User(id=67, username='******')
        self.user.set_password('secret')
        self.user.save()
        self.user1 = User(id=70, username='******')
        self.user1.set_password('secret')
        self.user1.save()
        self.group = Group(id=45, name='testing_group')
        self.group.save()

        models.client.GanetiRapiClient = RapiProxy
        self.cluster0 = Cluster.objects.create(hostname='test0', slug='test0')
        self.cluster1 = Cluster.objects.create(hostname='test1', slug='test1')
        self.cluster2 = Cluster.objects.create(hostname='test2', slug='test2')
        self.cluster3 = Cluster.objects.create(hostname='test3', slug='test3')
        self.cluster0.sync_nodes()

        # Give each cluster write permissions, and set it's info
        for cluster in (self.cluster0, self.cluster1, self.cluster2,
                        self.cluster3):
            cluster.username = self.user.username
            cluster.password = '******'
            cluster.info = INFO
            cluster.save()

    def tearDown(self):
        User.objects.all().delete()
        Group.objects.all().delete()
        VirtualMachine.objects.all().delete()
        Cluster.objects.all().delete()

    def test_default_choices(self):
        """
        Test that ChoiceFields have the correct default options
        """
        form = NewVirtualMachineForm(self.user)
        self.assertEqual([(u'', u'---------')],
            form.fields['nic_type'].choices)
        self.assertEqual([(u'', u'---------'),
            (u'routed', u'routed'),
            (u'bridged', u'bridged')],
            form.fields['nic_mode_0'].choices)
        self.assertEqual([(u'', u'---------')],
            form.fields['boot_order'].choices)
        self.assertEqual([(u'', u'---------'),
            (u'plain', u'plain'),
            (u'drbd', u'drbd'),
            (u'file', u'file'),
            (u'diskless', u'diskless')],
            form.fields['disk_template'].choices)

    def test_init_and_data_params(self):
        """
        Tests that passing initial does not trigger validation

        Verifies:
            * Passing data (arg[0]) will trigger validation
            * Passing initial will not trigger validation
        """
        form = NewVirtualMachineForm(self.user, initial={})
        self.assertEqual({}, form.errors)

        form = NewVirtualMachineForm(self.user, {})
        self.assertNotEqual({}, form.errors)

    def test_cluster_init(self):
        """
        Tests initializing a form with a Cluster

        Verifies:
            * cluster choices are set correctly
            * node choices are set correctly
        """

        # no cluster
        form = NewVirtualMachineForm(self.user)
        self.assertEqual([(u'', u'---------')], form.fields['pnode'].choices)
        self.assertEqual([(u'', u'---------')], form.fields['snode'].choices)
        self.assertEqual([(u'', u'---------')], form.fields['os'].choices)

        # cluster from initial data
        form = NewVirtualMachineForm(self.user, {'cluster': self.cluster0.id})
        self.assertEqual(set([(u'', u'---------'), (u'gtest1.example.bak', u'gtest1.example.bak'), (u'gtest2.example.bak', u'gtest2.example.bak'), (u'gtest3.example.bak', u'gtest3.example.bak')]), set(form.fields['pnode'].choices))
        self.assertEqual(set([(u'', u'---------'), (u'gtest1.example.bak', u'gtest1.example.bak'), (u'gtest2.example.bak', u'gtest2.example.bak'), (u'gtest3.example.bak', u'gtest3.example.bak')]), set(form.fields['snode'].choices))
        self.assertEqual(form.fields['os'].choices,
            [
                (u'', u'---------'),
                ('Image',
                    [('image+debian-osgeo', 'Debian Osgeo'),
                    ('image+ubuntu-lucid', 'Ubuntu Lucid')]
                )
            ]
        )

        # cluster from initial data
        form = NewVirtualMachineForm(self.user, {'cluster':self.cluster0.id})
        self.assertEqual(set([(u'', u'---------'), (u'gtest1.example.bak', u'gtest1.example.bak'), (u'gtest2.example.bak', u'gtest2.example.bak'), (u'gtest3.example.bak', u'gtest3.example.bak')]), set(form.fields['pnode'].choices))
        self.assertEqual(set([(u'', u'---------'), (u'gtest1.example.bak', u'gtest1.example.bak'), (u'gtest2.example.bak', u'gtest2.example.bak'), (u'gtest3.example.bak', u'gtest3.example.bak')]), set(form.fields['snode'].choices))
        self.assertEqual(form.fields['os'].choices,
            [
                (u'', u'---------'),
                ('Image',
                    [('image+debian-osgeo', 'Debian Osgeo'),
                    ('image+ubuntu-lucid', 'Ubuntu Lucid')]
                )
            ]
        )

    def test_cluster_choices_init(self):
        """
        Tests that cluster choices are based on User permissions

        Verifies:
            * superusers have all Clusters as choices
            * if owner is set, only display clusters the owner has permissions
              directly on.  This includes both users and groups
            * if no owner is set, choices include clusters that the user has
              permission directly on, or through a group
        """

        # no owner, no permissions
        form = NewVirtualMachineForm(self.user)
        self.assertEqual(set([(u'', u'---------')]), set(form.fields['cluster'].choices))

        # no owner, group and direct permissions
        self.user.grant('admin', self.cluster0)
        self.user.grant('create_vm', self.cluster1)
        self.group.grant('admin', self.cluster2)
        self.group.user_set.add(self.user)
        self.assertEqual(set([(u'', u'---------'), (self.cluster0.pk, u'test0'), (self.cluster1.pk, u'test1'), (self.cluster2.pk, u'test2')]), set(form.fields['cluster'].choices))
        self.user.revoke_all(self.cluster0)
        self.user.revoke_all(self.cluster1)
        self.group.revoke_all(self.cluster2)

        # owner, user with no choices
        form = NewVirtualMachineForm(self.user, initial={'owner':self.user.get_profile().id})
        self.assertEqual(set([(u'', u'---------')]), set(form.fields['cluster'].choices))

        # owner, user with choices
        self.user.grant('admin', self.cluster0)
        self.user.grant('create_vm', self.cluster1)
        form = NewVirtualMachineForm(self.user, initial={'owner':self.user.get_profile().id})
        self.assertEqual(set([(u'', u'---------'), (self.cluster0.pk, u'test0'), (self.cluster1.pk, u'test1')]), set(form.fields['cluster'].choices))

        # owner, group with no choices
        form = NewVirtualMachineForm(self.user, initial={'owner':self.group.organization.id})
        self.assertEqual(set([(u'', u'---------')]), set(form.fields['cluster'].choices))

        # owner, group with choices
        self.group.grant('admin', self.cluster2)
        self.group.grant('create_vm', self.cluster3)
        form = NewVirtualMachineForm(self.user, initial={'owner':self.group.organization.id})
        self.assertEqual(set([(u'', u'---------'), (self.cluster2.pk, u'test2'), (self.cluster3.pk, u'test3')]), set(form.fields['cluster'].choices))

        # user - superuser
        self.user.is_superuser = True
        self.user.save()
        form = NewVirtualMachineForm(self.user, initial={'owner':self.user.get_profile().id})
        self.assertEqual(set([(u'', u'---------'), (self.cluster0.pk, u'test0'), (self.cluster1.pk, u'test1'), (self.cluster2.pk, u'test2'), (self.cluster3.pk, u'test3')]), set(form.fields['cluster'].choices))

        # group - superuser
        form = NewVirtualMachineForm(self.user, initial={'owner':self.group.organization.id})
        self.assertEqual(set([(u'', u'---------'), (self.cluster0.pk, u'test0'), (self.cluster1.pk, u'test1'), (self.cluster2.pk, u'test2'), (self.cluster3.pk, u'test3')]), set(form.fields['cluster'].choices))

    def test_owner_choices_init(self):
        """
        Tests that owner choices are set based on User permissions

        Verifies:
            * superusers have all clusterusers as choices
            * user receives themselves as a choice if they have perms
            * user receives all groups they are a member of
        """

        # user with no choices
        form = NewVirtualMachineForm(self.user)
        self.assertEqual([(u'', u'---------')], form.fields['owner'].choices)

        # user with perms on self, no groups
        self.user.grant('admin', self.cluster0)
        form = NewVirtualMachineForm(self.user)
        self.assertEqual(
            [
                (u'', u'---------'),
                (self.user.profile.id, u'tester0'),
            ], form.fields['owner'].choices)
        self.user.set_perms(['create_vm'], self.cluster0)
        form = NewVirtualMachineForm(self.user)
        self.assertEqual(
            [
                (u'', u'---------'),
                (self.user.profile.id, u'tester0'),
            ], form.fields['owner'].choices)

        # user with perms on self and groups
        self.group.user_set.add(self.user)
        self.group.grant('admin', self.cluster0)
        form = NewVirtualMachineForm(self.user)
        self.assertEqual(
            [
                (u'', u'---------'),
                (self.group.organization.id, u'testing_group'),
                (self.user.profile.id, u'tester0'),
            ], form.fields['owner'].choices)
        self.user.revoke_all(self.cluster0)

        # user with no perms on self, but groups
        form = NewVirtualMachineForm(self.user)
        self.assertEqual(
            [
                (u'', u'---------'),
                (self.group.organization.id, u'testing_group'),
            ], form.fields['owner'].choices)
        self.group.set_perms(['create_vm'], self.cluster0)
        form = NewVirtualMachineForm(self.user)
        self.assertEqual(
            [
                (u'', u'---------'),
                (self.group.organization.id, u'testing_group'),
            ], form.fields['owner'].choices)
        self.group.revoke_all(self.cluster0)

        # superuser
        self.user.is_superuser = True
        self.user.save()
        form = NewVirtualMachineForm(self.user)
        self.assertEqual(
            [
                (u'', u'---------'),
                (self.user.profile.id, u'tester0'),
                (self.user1.profile.id, u'tester1'),
                (self.group.organization.id, u'testing_group'),
            ], list(form.fields['owner'].choices))

    def test_default_disks(self):
        self.user.grant('admin', self.cluster0)
        form = NewVirtualMachineForm(self.user)
        self.assertTrue('disk_size_0' in form.fields)
        self.assertFalse('disk_size_1' in form.fields)

    def test_no_disks(self):
        self.user.grant('admin', self.cluster0)
        form = NewVirtualMachineForm(self.user, dict(disk_count=0))
        self.assertFalse('disk_size_0' in form.fields)
        self.assertFalse('disk_size_1' in form.fields)

    def test_single_disk(self):
        self.user.grant('admin', self.cluster0)
        form = NewVirtualMachineForm(self.user, dict(disk_count=1))
        self.assertTrue('disk_size_0' in form.fields)
        self.assertFalse('disk_size_1' in form.fields)

    def test_multiple_disks(self):
        self.user.grant('admin', self.cluster0)
        form = NewVirtualMachineForm(self.user, dict(disk_count=2))
        self.assertTrue('disk_size_0' in form.fields)
        self.assertTrue('disk_size_1' in form.fields)

    def test_multiple_disks_from_dict(self):
        self.user.grant('admin', self.cluster0)
        initial = dict(disks=[dict(size=123), dict(size=456)])
        form = NewVirtualMachineForm(self.user, initial)
        self.assertTrue('disk_size_0' in form.fields)
        self.assertTrue('disk_size_1' in form.fields)
        
        data = form.data
        self.assertEqual(2, data['disk_count'])
        self.assertEqual(123, data['disk_size_0'])
        self.assertEqual(456, data['disk_size_1'])

    def test_default_nics(self):
        self.user.grant('admin', self.cluster0)
        form = NewVirtualMachineForm(self.user)
        self.assertTrue('nic_mode_0' in form.fields)
        self.assertFalse('nic_mode_1' in form.fields)
        self.assertTrue('nic_link_0' in form.fields)
        self.assertFalse('nic_link_1' in form.fields)

    def test_no_nics(self):
        self.user.grant('admin', self.cluster0)
        form = NewVirtualMachineForm(self.user, dict(nic_count=0))
        self.assertFalse('nic_mode_0' in form.fields)
        self.assertFalse('nic_mode_1' in form.fields)
        self.assertFalse('nic_link_0' in form.fields)
        self.assertFalse('nic_link_1' in form.fields)

    def test_single_nic(self):
        self.user.grant('admin', self.cluster0)
        form = NewVirtualMachineForm(self.user, dict(nic_count=1))
        self.assertTrue('nic_mode_0' in form.fields)
        self.assertFalse('nic_mode_1' in form.fields)
        self.assertTrue('nic_link_0' in form.fields)
        self.assertFalse('nic_link_1' in form.fields)

    def test_multiple_nics(self):
        self.user.grant('admin', self.cluster0)
        form = NewVirtualMachineForm(self.user, dict(nic_count=2))
        self.assertTrue('nic_mode_0' in form.fields)
        self.assertTrue('nic_mode_1' in form.fields)
        self.assertTrue('nic_link_0' in form.fields)
        self.assertTrue('nic_link_1' in form.fields)

    def test_multiple_nics_from_dict(self):
        self.user.grant('admin', self.cluster0)
        initial = dict(nics=[dict(mode=123, link='br0'), dict(mode=456, link='br1')])
        form = NewVirtualMachineForm(self.user, initial)
        self.assertTrue('nic_mode_0' in form.fields)
        self.assertTrue('nic_mode_1' in form.fields)
        self.assertTrue('nic_link_0' in form.fields)
        self.assertTrue('nic_link_1' in form.fields)

        data = form.data
        self.assertEqual(2, data['nic_count'])
        self.assertEqual(123, data['nic_mode_0'])
        self.assertEqual(456, data['nic_mode_1'])
        self.assertEqual('br0', data['nic_link_0'])
        self.assertEqual('br1', data['nic_link_1'])