Example #1
0
 def test_new_creates_nodegroup_with_interface(self):
     name = factory.make_name('nodegroup')
     uuid = factory.getRandomUUID()
     ip = factory.getRandomIPAddress()
     nodegroup = NodeGroup.objects.new(name, uuid, ip)
     interface = get_one(nodegroup.nodegroupinterface_set.all())
     self.assertEqual((name, uuid, ip),
                      (nodegroup.name, nodegroup.uuid, interface.ip))
Example #2
0
 def test_populates_cluster_name(self):
     cluster_name = factory.make_name('cluster_name')
     uuid = factory.getRandomUUID()
     form = NodeGroupWithInterfacesForm(
         status=NODEGROUP_STATUS.ACCEPTED,
         data={'cluster_name': cluster_name, 'uuid': uuid})
     self.assertTrue(form.is_valid(), form._errors)
     nodegroup = form.save()
     self.assertEqual(cluster_name, nodegroup.cluster_name)
Example #3
0
 def test_creates_nodegroup_with_status(self):
     name = factory.make_name('name')
     uuid = factory.getRandomUUID()
     form = NodeGroupWithInterfacesForm(
         status=NODEGROUP_STATUS.ACCEPTED,
         data={'name': name, 'uuid': uuid})
     self.assertTrue(form.is_valid(), form._errors)
     nodegroup = form.save()
     self.assertEqual(NODEGROUP_STATUS.ACCEPTED, nodegroup.status)
Example #4
0
 def test_new_creates_nodegroup_with_interface(self):
     name = factory.make_name('nodegroup')
     uuid = factory.getRandomUUID()
     ip = factory.getRandomIPAddress()
     nodegroup = NodeGroup.objects.new(name, uuid, ip)
     interface = get_one(nodegroup.nodegroupinterface_set.all())
     self.assertEqual(
         (name, uuid, ip),
         (nodegroup.name, nodegroup.uuid, interface.ip))
Example #5
0
    def test_registers_as_master_if_master_not_configured(self):
        reset_master()
        uuid = factory.getRandomUUID()
        request = make_register_request(uuid)

        nodegroup = api.register_nodegroup(request, uuid)

        self.assertEqual(uuid, nodegroup.uuid)
        self.assertEqual(NODEGROUP_STATUS.PENDING, nodegroup.status)
        self.assertEqual(NodeGroup.objects.ensure_master().id, nodegroup.id)
Example #6
0
    def test_creates_pending_nodegroup_by_default(self):
        create_configured_master()
        uuid = factory.getRandomUUID()
        request = make_register_request(uuid)

        nodegroup = api.register_nodegroup(request, uuid)

        self.assertEqual(uuid, nodegroup.uuid)
        self.assertEqual(NODEGROUP_STATUS.PENDING, nodegroup.status)
        self.assertNotEqual(NodeGroup.objects.ensure_master().id, nodegroup.id)
Example #7
0
 def test_rejects_invalid_list_interfaces(self):
     name = factory.make_name('name')
     uuid = factory.getRandomUUID()
     invalid_interfaces = json.dumps('invalid interface list')
     form = NodeGroupWithInterfacesForm(
         data={
             'name': name, 'uuid': uuid, 'interfaces': invalid_interfaces})
     self.assertFalse(form.is_valid())
     self.assertEquals(
         {'interfaces': [INTERFACES_VALIDATION_ERROR_MESSAGE]},
         form._errors)
Example #8
0
 def test_rejects_invalid_json_interfaces(self):
     name = factory.make_name('name')
     uuid = factory.getRandomUUID()
     invalid_interfaces = factory.make_name('invalid_json_interfaces')
     form = NodeGroupWithInterfacesForm(
         data={
             'name': name, 'uuid': uuid, 'interfaces': invalid_interfaces})
     self.assertFalse(form.is_valid())
     self.assertEquals(
         {'interfaces': ['Invalid json value.']},
         form._errors)
Example #9
0
    def test_updates_and_accepts_local_master_if_master_not_configured(self):
        reset_master()
        uuid = factory.getRandomUUID()
        create_local_cluster_config(self, uuid)
        request = make_register_request(uuid)

        nodegroup = api.register_nodegroup(request, uuid)

        self.assertEqual(uuid, nodegroup.uuid)
        self.assertEqual(NODEGROUP_STATUS.ACCEPTED, nodegroup.status)
        self.assertEqual(NodeGroup.objects.ensure_master().id, nodegroup.id)
Example #10
0
    def test_keeps_local_cluster_controller_pending_if_master_configured(self):
        create_configured_master()
        uuid = factory.getRandomUUID()
        create_local_cluster_config(self, uuid)
        request = make_register_request(uuid)

        nodegroup = api.register_nodegroup(request, uuid)

        self.assertEqual(uuid, nodegroup.uuid)
        self.assertEqual(NODEGROUP_STATUS.PENDING, nodegroup.status)
        self.assertNotEqual(NodeGroup.objects.ensure_master().id, nodegroup.id)
Example #11
0
 def test_rejects_invalid_interface(self):
     name = factory.make_name('name')
     uuid = factory.getRandomUUID()
     interface = make_interface_settings()
     # Make the interface invalid.
     interface['ip_range_high'] = 'invalid IP address'
     interfaces = json.dumps([interface])
     form = NodeGroupWithInterfacesForm(
         data={'name': name, 'uuid': uuid, 'interfaces': interfaces})
     self.assertFalse(form.is_valid())
     self.assertIn(
         "Enter a valid IPv4 or IPv6 address",
         form._errors['interfaces'][0])
Example #12
0
    def test_register_nodegroup_uses_default_zone_name(self):
        uuid = factory.getRandomUUID()
        create_local_cluster_config(self, uuid)

        response = self.client.post(reverse('nodegroups_handler'), {
            'op': 'register',
            'uuid': uuid,
        })
        self.assertEqual(httplib.OK, response.status_code, response)

        master = NodeGroup.objects.ensure_master()
        self.assertEqual((NODEGROUP_STATUS.ACCEPTED, DEFAULT_DNS_ZONE_NAME),
                         (master.status, master.name))
Example #13
0
 def test_creates_interface_from_params(self):
     name = factory.make_name('name')
     uuid = factory.getRandomUUID()
     interface = make_interface_settings()
     interfaces = json.dumps([interface])
     form = NodeGroupWithInterfacesForm(
         data={'name': name, 'uuid': uuid, 'interfaces': interfaces})
     self.assertTrue(form.is_valid(), form._errors)
     form.save()
     nodegroup = NodeGroup.objects.get(uuid=uuid)
     self.assertThat(
         nodegroup.nodegroupinterface_set.all()[0],
         MatchesStructure.byEquality(**interface))
Example #14
0
 def test_register_new_nodegroup_does_not_record_maas_url(self):
     # When registering a cluster, the URL with which the call was made
     # (i.e. from the perspective of the cluster) is *not* recorded.
     create_configured_master()
     name = factory.make_name('cluster')
     uuid = factory.getRandomUUID()
     update_maas_url = self.patch(api, "update_nodegroup_maas_url")
     response = self.client.post(reverse('nodegroups_handler'), {
         'op': 'register',
         'name': name,
         'uuid': uuid
     })
     self.assertEqual(httplib.ACCEPTED, response.status_code, response)
     self.assertEqual([], update_maas_url.call_args_list)
Example #15
0
 def test_creates_multiple_interfaces(self):
     name = factory.make_name('name')
     uuid = factory.getRandomUUID()
     interface1 = make_interface_settings()
     # Only one interface at most can be 'managed'.
     interface2 = make_interface_settings()
     interface2['management'] = NODEGROUPINTERFACE_MANAGEMENT.UNMANAGED
     interfaces = json.dumps([interface1, interface2])
     form = NodeGroupWithInterfacesForm(
         data={'name': name, 'uuid': uuid, 'interfaces': interfaces})
     self.assertTrue(form.is_valid(), form._errors)
     form.save()
     nodegroup = NodeGroup.objects.get(uuid=uuid)
     self.assertEqual(2,  nodegroup.nodegroupinterface_set.count())
Example #16
0
 def test_register_nodegroup_validates_data(self):
     create_configured_master()
     response = self.client.post(
         reverse('nodegroups_handler'), {
             'op': 'register',
             'name': factory.make_name('cluster'),
             'uuid': factory.getRandomUUID(),
             'interfaces': 'invalid data',
         })
     self.assertEqual((
         httplib.BAD_REQUEST,
         {
             'interfaces': ['Invalid json value.']
         },
     ), (response.status_code, json.loads(response.content)))
Example #17
0
 def test_creates_pending_nodegroup(self):
     name = factory.make_name('name')
     uuid = factory.getRandomUUID()
     form = NodeGroupWithInterfacesForm(
         data={'name': name, 'uuid': uuid})
     self.assertTrue(form.is_valid(), form._errors)
     nodegroup = form.save()
     self.assertEqual(
         (uuid, name, NODEGROUP_STATUS.PENDING, 0),
         (
             nodegroup.uuid,
             nodegroup.name,
             nodegroup.status,
             nodegroup.nodegroupinterface_set.count(),
         ))
Example #18
0
    def test_register_returns_compose_nodegroup_register_response(self):
        # register() returns whatever compose_nodegroup_register_response()
        # tells it to return.
        expected_response = factory.getRandomString()
        self.patch(api, 'compose_nodegroup_register_response',
                   Mock(return_value=expected_response))

        response = self.client.post(
            reverse('nodegroups_handler'), {
                'op': 'register',
                'name': factory.make_name('cluster'),
                'uuid': factory.getRandomUUID(),
            })

        self.assertIn('application/json', response['Content-Type'])
        self.assertEqual(expected_response, json.loads(response.content))
Example #19
0
 def test_checks_presence_of_other_managed_interfaces(self):
     name = factory.make_name('name')
     uuid = factory.getRandomUUID()
     interfaces = []
     for index in range(2):
         interface = make_interface_settings()
         interface['management'] = factory.getRandomEnum(
             NODEGROUPINTERFACE_MANAGEMENT,
             but_not=(NODEGROUPINTERFACE_MANAGEMENT.UNMANAGED, ))
         interfaces.append(interface)
     interfaces = json.dumps(interfaces)
     form = NodeGroupWithInterfacesForm(
         data={'name': name, 'uuid': uuid, 'interfaces': interfaces})
     self.assertFalse(form.is_valid())
     self.assertIn(
         "Only one managed interface can be configured for this cluster",
         form._errors['interfaces'][0])
Example #20
0
 def test_creates_unmanaged_interfaces(self):
     name = factory.make_name('name')
     uuid = factory.getRandomUUID()
     interface = make_interface_settings()
     del interface['management']
     interfaces = json.dumps([interface])
     form = NodeGroupWithInterfacesForm(
         data={'name': name, 'uuid': uuid, 'interfaces': interfaces})
     self.assertTrue(form.is_valid(), form._errors)
     form.save()
     nodegroup = NodeGroup.objects.get(uuid=uuid)
     self.assertEqual(
         [NODEGROUPINTERFACE_MANAGEMENT.UNMANAGED],
         [
             nodegroup.management for nodegroup in
             nodegroup.nodegroupinterface_set.all()
         ])
Example #21
0
 def test_register_master_nodegroup_does_not_update_maas_url(self):
     # When registering the master cluster, the MAAS URL we give it in
     # the future is *not* updated to the one on which the call was made.
     reset_master()
     name = factory.make_name('cluster')
     uuid = factory.getRandomUUID()
     create_local_cluster_config(self, uuid)
     update_maas_url = self.patch(api, "update_nodegroup_maas_url")
     response = self.client.post(reverse('nodegroups_handler'), {
         'op': 'register',
         'name': name,
         'uuid': uuid
     })
     self.assertEqual(httplib.OK, response.status_code, response)
     # This really did configure the master.
     master = NodeGroup.objects.ensure_master()
     self.assertEqual(uuid, master.uuid)
     self.assertEqual([], update_maas_url.call_args_list)
     # The master's maas_url field remains empty.
     self.assertEqual("", master.maas_url)
Example #22
0
    def test_register_auto_accepts_local_master(self):
        reset_master()
        name = factory.make_name('cluster')
        uuid = factory.getRandomUUID()
        create_local_cluster_config(self, uuid)
        patch_broker_url(self)

        response = self.client.post(reverse('nodegroups_handler'), {
            'op': 'register',
            'name': name,
            'uuid': uuid,
        })
        self.assertEqual(httplib.OK, response.status_code, response)

        master = NodeGroup.objects.ensure_master()
        # The cluster controller that made the request is registered as the
        # master, since there was none.
        self.assertEqual((uuid, name), (master.uuid, master.name))
        # It is also auto-accepted.
        self.assertEqual(NODEGROUP_STATUS.ACCEPTED, master.status)
Example #23
0
 def test_register_creates_nodegroup_and_interfaces(self):
     create_configured_master()
     name = factory.make_name('cluster')
     uuid = factory.getRandomUUID()
     interface = make_interface_settings()
     response = self.client.post(
         reverse('nodegroups_handler'), {
             'op': 'register',
             'name': name,
             'uuid': uuid,
             'interfaces': json.dumps([interface]),
         })
     nodegroup = NodeGroup.objects.get(uuid=uuid)
     # The nodegroup was created with its interface.  Its status is
     # 'PENDING'.
     self.assertEqual((name, NODEGROUP_STATUS.PENDING),
                      (nodegroup.name, nodegroup.status))
     self.assertThat(nodegroup.nodegroupinterface_set.all()[0],
                     MatchesStructure.byEquality(**interface))
     # The response code is 'ACCEPTED': the nodegroup now needs to be
     # validated by an admin.
     self.assertEqual(httplib.ACCEPTED, response.status_code)
Example #24
0
    def test_register_configures_master_if_unconfigured(self):
        reset_master()
        name = factory.make_name('cluster')
        uuid = factory.getRandomUUID()
        create_local_cluster_config(self, uuid)
        interface = make_interface_settings()

        response = self.client.post(
            reverse('nodegroups_handler'), {
                'op': 'register',
                'name': name,
                'uuid': uuid,
                'interfaces': json.dumps([interface]),
            })
        self.assertEqual(httplib.OK, response.status_code, response)

        master = NodeGroup.objects.ensure_master()
        self.assertEqual(NODEGROUP_STATUS.ACCEPTED, master.status)
        self.assertThat(
            master.nodegroupinterface_set.get(
                interface=interface['interface']),
            MatchesStructure.byEquality(**interface))
Example #25
0
 def test_register_accepts_only_one_managed_interface(self):
     create_configured_master()
     name = factory.make_name('cluster')
     uuid = factory.getRandomUUID()
     # This will try to create 2 "managed" interfaces.
     interface1 = make_interface_settings()
     interface1['management'] = NODEGROUPINTERFACE_MANAGEMENT.DHCP
     interface2 = interface1.copy()
     response = self.client.post(
         reverse('nodegroups_handler'), {
             'op': 'register',
             'name': name,
             'uuid': uuid,
             'interfaces': json.dumps([interface1, interface2]),
         })
     self.assertEqual((
         httplib.BAD_REQUEST,
         {
             'interfaces': [
                 "Only one managed interface can be configured for "
                 "this cluster"
             ]
         },
     ), (response.status_code, json.loads(response.content)))
Example #26
0
 def test_get_local_cluster_UUID_returns_cluster_UUID(self):
     uuid = factory.getRandomUUID()
     file_name = self.make_file(contents='CLUSTER_UUID="%s"' % uuid)
     self.patch(settings, 'LOCAL_CLUSTER_CONFIG', file_name)
     self.assertEqual(uuid, get_local_cluster_UUID())
Example #27
0
def create_configured_master():
    """Set up a master, already configured."""
    master = NodeGroup.objects.ensure_master()
    master.uuid = factory.getRandomUUID()
    master.save()
Example #28
0
 def test_get_local_cluster_UUID_returns_cluster_UUID(self):
     uuid = factory.getRandomUUID()
     file_name = self.make_file(contents='CLUSTER_UUID="%s"' % uuid)
     self.patch(settings, 'LOCAL_CLUSTER_CONFIG', file_name)
     self.assertEqual(uuid, get_local_cluster_UUID())