diff --git a/grid5000/mixins.py b/grid5000/mixins.py index e56438a1f4c65dcfa90af1bb73b929962e10a0e1..adbb6b51189080f105142694c1e6ab0d1d34ac38 100644 --- a/grid5000/mixins.py +++ b/grid5000/mixins.py @@ -156,7 +156,7 @@ class CreateMixin(object): class DeleteMixin(object): @exc.on_http_error(exc.Grid5000DeleteError) - def delete(self, id, **kwargs): + def delete(self, id=None, **kwargs): """Delete an object on the server. Args: diff --git a/grid5000/objects.py b/grid5000/objects.py index 225ca0672163ae06bff76630e4141707d5f3ec25..54a566c1e5d990ce29d9d7fa3b6ba8f1445d59d9 100644 --- a/grid5000/objects.py +++ b/grid5000/objects.py @@ -2,6 +2,9 @@ from .base import * # noqa from .mixins import * # noqa +class FirewallPort(RESTObject): + _id_attr = None + class NetworkEquipment(RESTObject): pass @@ -72,6 +75,11 @@ class Cluster(RESTObject): class Job(RESTObject, RefreshMixin, ObjectDeleteMixin): _create_attrs = (("command"),) + _managers=( + ("firewall", "SiteJobFirewallManager"), + ) + + def __repr__(self): keys = ["uid", "site", "state", "user"] try: @@ -134,8 +142,6 @@ class JobManager(NoUpdateMixin, BracketMixin, RESTManager): _path = "/sites/%(site)s/jobs" _obj_cls = Job _from_parent_attrs = {"site": "uid"} - - class ClusterManager(RetrieveMixin, BracketMixin, RESTManager): _path = "/sites/%(site)s/clusters" _obj_cls = Cluster @@ -376,3 +382,18 @@ class SiteNetworkEquipmentManager(BracketMixin, RetrieveMixin, RESTManager): _path = "/sites/%(site)s/network_equipments" _obj_cls = NetworkEquipment _from_parent_attrs = {"site": "uid"} + + +class SiteJobFirewallManager(ListMixin, DeleteMixin, CreateMixin, RESTManager): + _path = "/sites/%(site)s/firewall/%(jobid)s" + _obj_cls = FirewallPort + _from_parent_attrs = {"site": "site", "jobid": "uid"} + + @exc.on_http_error(exc.Grid5000CreateError) + def create(self, data, **kwargs): + # The api answer with a list of firewall rules + self._check_missing_create_attrs(data) + + # Handle specific URL for creation + server_data = self.grid5000.http_post(self.path, post_data=data, **kwargs) + return [self._obj_cls(self, s) for s in server_data] \ No newline at end of file