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__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, 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__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__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_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__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__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_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__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_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_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(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_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_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 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)
def update(self, request, id): """@description-title Update a DHCP snippet @description Update a DHCP snippet with the given id. @param (int) "{id}" [required=true] A DHCP snippet id. @param (string) "name" [required=false] The name of the DHCP snippet. @param (string) "value" [required=false] The new value of the DHCP snippet to be used in dhcpd.conf. Previous values are stored and can be reverted. @param (string) "description" [required=false] A description of what the DHCP snippet does. @param (boolean) "enabled" [required=false] Whether or not the DHCP snippet is currently enabled. @param (string) "node" [required=false] The node the DHCP snippet is to be used for. Can not be set if subnet is set. @param (string) "subnet" [required=false] The subnet the DHCP snippet is to be used for. Can not be set if node is set. @param (boolean) "global_snippet" [required=false] Set the DHCP snippet to be a global option. This removes any node or subnet links. @success (http-status-code) "server-success" 200 @success (json) "success-json" A JSON object containing information about the updated DHCP snippet. @success-example "success-json" [exkey=dhcp-snippets-update] placeholder text @error (http-status-code) "404" 404 @error (content) "not-found" The requested DHCP snippet is not found. @error-example "not-found" Not Found """ dhcp_snippet = DHCPSnippet.objects.get_dhcp_snippet_or_404(id) form = DHCPSnippetForm(instance=dhcp_snippet, data=request.data) if form.is_valid(): return form.save(ENDPOINT.API, request) else: raise MAASAPIValidationError(form.errors)
def test__creates_dhcp_snippet_with_node(self): node = factory.make_Node() 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, }) self.assertTrue(form.is_valid(), form.errors) dhcp_snippet = form.save() self.assertEqual(value, dhcp_snippet.value.data) self.assertEqual(description, dhcp_snippet.description) self.assertEqual(enabled, dhcp_snippet.enabled) self.assertEqual(node, dhcp_snippet.node)
def test_creates_dhcp_snippet_with_node(self): node = factory.make_Node() 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, }) 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(value, dhcp_snippet.value.data) self.assertEqual(description, dhcp_snippet.description) self.assertEqual(enabled, dhcp_snippet.enabled) self.assertEqual(node, dhcp_snippet.node)
def create(Self, request): """Create a DHCP snippet. :param name: The name of the DHCP snippet. This is required to create a new DHCP snippet. :type name: unicode :param value: The snippet of config inserted into dhcpd.conf. This is required to create a new DHCP snippet. :type value: unicode :param description: A description of what the snippet does. :type description: unicode :param enabled: Whether or not the snippet is currently enabled. :type enabled: boolean :param node: The node this snippet applies to. Cannot be used with subnet or global_snippet. :type node: unicode :param subnet: The subnet this snippet applies to. Cannot be used with node or global_snippet. :type subnet: unicode :param global_snippet: Whether or not this snippet is to be applied globally. Cannot be used with node or subnet. :type global_snippet: boolean Returns 404 if the DHCP snippet is not found. """ form = DHCPSnippetForm(data=request.data) if form.is_valid(): return form.save() else: raise MAASAPIValidationError(form.errors)
def update(self, request, id): """Update a DHCP snippet. :param name: The name of the DHCP snippet. :type name: unicode :param value: The new value of the DHCP snippet to be used in dhcpd.conf. Previous values are stored and can be reverted. :type value: unicode :param description: A description of what the DHCP snippet does. :type description: unicode :param enabled: Whether or not the DHCP snippet is currently enabled. :type enabled: boolean :param node: The node the DHCP snippet is to be used for. Can not be set if subnet is set. :type node: unicode :param subnet: The subnet the DHCP snippet is to be used for. Can not be set if node is set. :type subnet: unicode :param global_snippet: Set the DHCP snippet to be a global option. This removes any node or subnet links. :type global_snippet: boolean Returns 404 if the DHCP snippet is not found. """ dhcp_snippet = DHCPSnippet.objects.get_dhcp_snippet_or_404(id) form = DHCPSnippetForm(instance=dhcp_snippet, data=request.data) if form.is_valid(): return form.save() else: raise MAASAPIValidationError(form.errors)
def test__creates_dhcp_snippet_with_subnet(self): 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, '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(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)