def create(self, request): """@description-title Create a DHCP snippet @description Creates a DHCP snippet. @param (string) "name" [required=true] The name of the DHCP snippet. @param (string) "value" [required=true] The snippet of config inserted into dhcpd.conf. @param (string) "description" [required=false] A description of what the snippet does. @param (boolean) "enabled" [required=false] Whether or not the snippet is currently enabled. @param (string) "node" [required=false] The node this snippet applies to. Cannot be used with subnet or global_snippet. @param (string) "subnet" [required=false] The subnet this snippet applies to. Cannot be used with node or global_snippet. @param (boolean) "global_snippet" [required=false] Whether or not this snippet is to be applied globally. Cannot be used with node or subnet. @success (http-status-code) "server-success" 200 @success (json) "success-json" A JSON object containing the new DHCP snippet object. @success-example "success-json" [exkey=dhcp-snippets-create] placeholder text """ form = DHCPSnippetForm(data=request.data) if form.is_valid(): return form.save(ENDPOINT.API, request) else: raise MAASAPIValidationError(form.errors)
def test__creates_dhcp_snippet(self): name = factory.make_name('name') value = factory.make_string() description = factory.make_string() enabled = factory.pick_bool() form = DHCPSnippetForm( data={ 'name': name, 'value': value, 'description': description, 'enabled': enabled, }) self.assertTrue(form.is_valid(), form.errors) endpoint = factory.pick_choice(ENDPOINT_CHOICES) request = HttpRequest() request.user = factory.make_User() dhcp_snippet = form.save(endpoint, request) self.assertEqual(name, dhcp_snippet.name) self.assertEqual(value, dhcp_snippet.value.data) self.assertEqual(description, dhcp_snippet.description) self.assertEqual(enabled, dhcp_snippet.enabled) event = Event.objects.get(type__level=AUDIT) self.assertIsNotNone(event) self.assertEqual(event.description, "Created DHCP snippet '%s'." % dhcp_snippet.name)
def test_create_dhcp_snippet_with_iprange(self): subnet = factory.make_ipv4_Subnet_with_IPRanges() iprange = subnet.get_dynamic_ranges().first() iprange.save() name = factory.make_name("name") value = factory.make_string() description = factory.make_string() enabled = factory.pick_bool() form = DHCPSnippetForm( data={ "name": name, "value": value, "description": description, "enabled": enabled, "subnet": subnet.id, "iprange": iprange.id, } ) self.assertTrue(form.is_valid(), form.errors) endpoint = factory.pick_choice(ENDPOINT_CHOICES) request = HttpRequest() request.user = factory.make_User() dhcp_snippet = form.save(endpoint, request) self.assertEqual(name, dhcp_snippet.name) self.assertEqual(value, dhcp_snippet.value.data) self.assertEqual(description, dhcp_snippet.description) self.assertEqual(enabled, dhcp_snippet.enabled) self.assertEqual(subnet, dhcp_snippet.subnet) self.assertEqual(iprange, dhcp_snippet.iprange)
def create(self, params): """Create the object from params iff admin.""" if not reload_object(self.user).is_superuser: raise HandlerPermissionError() request = HttpRequest() request.user = self.user # Create by using form. form = DHCPSnippetForm(request=request, data=params) if form.is_valid(): try: obj = form.save(ENDPOINT.UI, request) except ValidationError as e: try: raise HandlerValidationError(e.message_dict) except AttributeError: raise HandlerValidationError({"__all__": e.message}) return self.full_dehydrate(obj) else: raise HandlerValidationError(form.errors) # Create by updating the fields on the object. obj = self._meta.object_class() obj = self.full_hydrate(obj, params) obj.save() return self.full_dehydrate(obj)
def test__update_global_snippet_resets_node(self): node = factory.make_Node() dhcp_snippet = factory.make_DHCPSnippet(node=node) form = DHCPSnippetForm( instance=dhcp_snippet, data={"global_snippet": True}) self.assertTrue(form.is_valid(), form.errors) dhcp_snippet = form.save() self.assertIsNone(dhcp_snippet.node)
def test__updates_subnet(self): dhcp_snippet = factory.make_DHCPSnippet() subnet = factory.make_Subnet() form = DHCPSnippetForm( instance=dhcp_snippet, data={'subnet': subnet.id}) self.assertTrue(form.is_valid(), form.errors) dhcp_snippet = form.save() self.assertEqual(subnet, dhcp_snippet.subnet)
def test__updates_node(self): dhcp_snippet = factory.make_DHCPSnippet() node = factory.make_Node() form = DHCPSnippetForm( instance=dhcp_snippet, data={'node': node.system_id}) self.assertTrue(form.is_valid(), form.errors) dhcp_snippet = form.save() self.assertEqual(node, dhcp_snippet.node)
def test__updates_enabled(self): dhcp_snippet = factory.make_DHCPSnippet() enabled = not dhcp_snippet.enabled form = DHCPSnippetForm( instance=dhcp_snippet, data={'enabled': enabled}) self.assertTrue(form.is_valid(), form.errors) dhcp_snippet = form.save() self.assertEqual(enabled, dhcp_snippet.enabled)
def test__updates_description(self): dhcp_snippet = factory.make_DHCPSnippet() description = factory.make_string() form = DHCPSnippetForm( instance=dhcp_snippet, data={'description': description}) self.assertTrue(form.is_valid(), form.errors) dhcp_snippet = form.save() self.assertEqual(description, dhcp_snippet.description)
def test__update_global_snippet_resets_subnet(self): subnet = factory.make_Subnet() dhcp_snippet = factory.make_DHCPSnippet(subnet=subnet) form = DHCPSnippetForm( instance=dhcp_snippet, data={"global_snippet": True}) self.assertTrue(form.is_valid(), form.errors) dhcp_snippet = form.save() self.assertIsNone(dhcp_snippet.subnet)
def test__updates_name(self): dhcp_snippet = factory.make_DHCPSnippet() name = factory.make_name('name') form = DHCPSnippetForm( instance=dhcp_snippet, data={'name': name}) self.assertTrue(form.is_valid(), form.errors) dhcp_snippet = form.save() self.assertEqual(name, dhcp_snippet.name)
def test__cannot_update_both_node_and_subnet(self): dhcp_snippet = factory.make_DHCPSnippet() form = DHCPSnippetForm(instance=dhcp_snippet, data={ 'node': factory.make_Node().system_id, 'subnet': factory.make_Subnet().id, }) self.assertFalse(form.is_valid())
def test__updates_subnet_when_node_set(self): dhcp_snippet = factory.make_DHCPSnippet(node=factory.make_Node()) subnet = factory.make_Subnet() form = DHCPSnippetForm( instance=dhcp_snippet, data={'subnet': subnet.id}) self.assertTrue(form.is_valid(), form.errors) dhcp_snippet = form.save() self.assertIsNone(dhcp_snippet.node) self.assertEquals(subnet, dhcp_snippet.subnet)
def test__update_failure_doesnt_delete_value(self): dhcp_snippet = factory.make_DHCPSnippet() value = dhcp_snippet.value.data form = DHCPSnippetForm(instance=dhcp_snippet, data={ 'node': factory.make_Node().system_id, 'subnet': factory.make_Subnet().id, }) self.assertFalse(form.is_valid()) self.assertEquals(value, reload_object(dhcp_snippet).value.data)
def test__updates_value(self): dhcp_snippet = factory.make_DHCPSnippet() old_value = dhcp_snippet.value.data new_value = factory.make_string() form = DHCPSnippetForm( instance=dhcp_snippet, data={'value': new_value}) self.assertTrue(form.is_valid(), form.errors) dhcp_snippet = form.save() self.assertEqual(new_value, dhcp_snippet.value.data) self.assertEqual(old_value, dhcp_snippet.value.previous_version.data)
def test__updates_enabled(self): dhcp_snippet = factory.make_DHCPSnippet() enabled = not dhcp_snippet.enabled form = DHCPSnippetForm(instance=dhcp_snippet, data={'enabled': enabled}) self.assertTrue(form.is_valid(), form.errors) endpoint = factory.pick_choice(ENDPOINT_CHOICES) request = HttpRequest() request.user = factory.make_User() dhcp_snippet = form.save(endpoint, request) self.assertEqual(enabled, dhcp_snippet.enabled)
def test__updates_description(self): dhcp_snippet = factory.make_DHCPSnippet() description = factory.make_string() form = DHCPSnippetForm(instance=dhcp_snippet, data={'description': description}) self.assertTrue(form.is_valid(), form.errors) endpoint = factory.pick_choice(ENDPOINT_CHOICES) request = HttpRequest() request.user = factory.make_User() dhcp_snippet = form.save(endpoint, request) self.assertEqual(description, dhcp_snippet.description)
def test__updates_subnet(self): dhcp_snippet = factory.make_DHCPSnippet() subnet = factory.make_Subnet() form = DHCPSnippetForm(instance=dhcp_snippet, data={'subnet': subnet.id}) self.assertTrue(form.is_valid(), form.errors) endpoint = factory.pick_choice(ENDPOINT_CHOICES) request = HttpRequest() request.user = factory.make_User() dhcp_snippet = form.save(endpoint, request) self.assertEqual(subnet, dhcp_snippet.subnet)
def test__update_global_snippet_resets_subnet(self): subnet = factory.make_Subnet() dhcp_snippet = factory.make_DHCPSnippet(subnet=subnet) form = DHCPSnippetForm(instance=dhcp_snippet, data={"global_snippet": True}) self.assertTrue(form.is_valid(), form.errors) endpoint = factory.pick_choice(ENDPOINT_CHOICES) request = HttpRequest() request.user = factory.make_User() dhcp_snippet = form.save(endpoint, request) self.assertIsNone(dhcp_snippet.subnet)
def test__updates_node(self): dhcp_snippet = factory.make_DHCPSnippet() node = factory.make_Node() form = DHCPSnippetForm(instance=dhcp_snippet, data={'node': node.system_id}) self.assertTrue(form.is_valid(), form.errors) endpoint = factory.pick_choice(ENDPOINT_CHOICES) request = HttpRequest() request.user = factory.make_User() dhcp_snippet = form.save(endpoint, request) self.assertEqual(node, dhcp_snippet.node)
def test_updates_subnet_when_node_set(self): dhcp_snippet = factory.make_DHCPSnippet(node=factory.make_Node()) subnet = factory.make_Subnet() form = DHCPSnippetForm(instance=dhcp_snippet, data={"subnet": subnet.id}) self.assertTrue(form.is_valid(), form.errors) endpoint = factory.pick_choice(ENDPOINT_CHOICES) request = HttpRequest() request.user = factory.make_User() dhcp_snippet = form.save(endpoint, request) self.assertIsNone(dhcp_snippet.node) self.assertEquals(subnet, dhcp_snippet.subnet)
def test__updates_value(self): dhcp_snippet = factory.make_DHCPSnippet() old_value = dhcp_snippet.value.data new_value = factory.make_string() form = DHCPSnippetForm(instance=dhcp_snippet, data={'value': new_value}) self.assertTrue(form.is_valid(), form.errors) endpoint = factory.pick_choice(ENDPOINT_CHOICES) request = HttpRequest() request.user = factory.make_User() dhcp_snippet = form.save(endpoint, request) self.assertEqual(new_value, dhcp_snippet.value.data) self.assertEqual(old_value, dhcp_snippet.value.previous_version.data)
def test__updates_name(self): dhcp_snippet = factory.make_DHCPSnippet() name = factory.make_name('name') form = DHCPSnippetForm(instance=dhcp_snippet, data={'name': name}) self.assertTrue(form.is_valid(), form.errors) endpoint = factory.pick_choice(ENDPOINT_CHOICES) request = HttpRequest() request.user = factory.make_User() dhcp_snippet = form.save(endpoint, request) self.assertEqual(name, dhcp_snippet.name) event = Event.objects.get(type__level=AUDIT) self.assertIsNotNone(event) self.assertEqual(event.description, "Updated DHCP snippet '%s'." % dhcp_snippet.name)
def test__create_dhcp_snippet_defaults_to_enabled(self): name = factory.make_name('name') value = factory.make_string() description = factory.make_string() form = DHCPSnippetForm(data={ 'name': name, 'value': value, 'description': description, }) self.assertTrue(form.is_valid(), form.errors) dhcp_snippet = form.save() self.assertEqual(name, dhcp_snippet.name) self.assertEqual(value, dhcp_snippet.value.data) self.assertEqual(description, dhcp_snippet.description) self.assertTrue(dhcp_snippet.enabled)
def test_create_dhcp_snippet_defaults_to_enabled(self): name = factory.make_name("name") value = factory.make_string() description = factory.make_string() form = DHCPSnippetForm( data={"name": name, "value": value, "description": description} ) self.assertTrue(form.is_valid(), form.errors) endpoint = factory.pick_choice(ENDPOINT_CHOICES) request = HttpRequest() request.user = factory.make_User() dhcp_snippet = form.save(endpoint, request) self.assertEqual(name, dhcp_snippet.name) self.assertEqual(value, dhcp_snippet.value.data) self.assertEqual(description, dhcp_snippet.description) self.assertTrue(dhcp_snippet.enabled)
def test__cannt_create_dhcp_snippet_with_node_and_subnet(self): node = factory.make_Node() subnet = factory.make_Subnet() name = factory.make_name('name') value = factory.make_string() description = factory.make_string() enabled = factory.pick_bool() form = DHCPSnippetForm(data={ 'name': name, 'value': value, 'description': description, 'enabled': enabled, 'node': node.system_id, 'subnet': subnet.id, }) self.assertFalse(form.is_valid())
def test_cannt_create_dhcp_snippet_with_node_and_subnet(self): node = factory.make_Node() subnet = factory.make_Subnet() name = factory.make_name("name") value = factory.make_string() description = factory.make_string() enabled = factory.pick_bool() form = DHCPSnippetForm( data={ "name": name, "value": value, "description": description, "enabled": enabled, "node": node.system_id, "subnet": subnet.id, }) self.assertFalse(form.is_valid())
def test_create_dhcp_snippet_with_iprange_requires_subnet(self): subnet = factory.make_ipv4_Subnet_with_IPRanges() iprange = subnet.get_dynamic_ranges().first() iprange.save() name = factory.make_name("name") value = factory.make_string() description = factory.make_string() enabled = factory.pick_bool() form = DHCPSnippetForm( data={ "name": name, "value": value, "dscription": description, "enabled": enabled, "iprange": iprange.id, } ) self.assertFalse(form.is_valid(), form.errors)
def test__fail_validation_on_create_cleans_value(self): node = factory.make_Node() subnet = factory.make_Subnet() name = factory.make_name('name') value = factory.make_string() description = factory.make_string() enabled = factory.pick_bool() form = DHCPSnippetForm(data={ 'name': name, 'value': value, 'description': description, 'enabled': enabled, 'node': node.system_id, 'subnet': subnet.id, }) self.assertFalse(form.is_valid()) self.assertItemsEqual([], DHCPSnippet.objects.all()) self.assertItemsEqual([], VersionedTextFile.objects.all())
def update(self, params): """Update the object from params iff admin.""" if not self.user.is_superuser: raise HandlerPermissionError() obj = self.get_object(params) request = HttpRequest() request.user = self.user # Update by using form. form = DHCPSnippetForm(instance=obj, request=request, data=params) if form.is_valid(): try: obj = form.save(ENDPOINT.UI, request) except ValidationError as e: raise HandlerValidationError(e.error_dict) return self.full_dehydrate(obj) else: raise HandlerValidationError(form.errors)