diff --git a/scaleway-async/scaleway_async/k8s/v1/__init__.py b/scaleway-async/scaleway_async/k8s/v1/__init__.py index f27274871..6a088ca7f 100644 --- a/scaleway-async/scaleway_async/k8s/v1/__init__.py +++ b/scaleway-async/scaleway_async/k8s/v1/__init__.py @@ -24,6 +24,8 @@ from .types import ClusterAutoscalerConfig from .types import ClusterOpenIDConnectConfig from .types import Pool +from .types import ACLRuleRequest +from .types import ACLRule from .types import CreateClusterRequestAutoUpgrade from .types import CreateClusterRequestAutoscalerConfig from .types import CreateClusterRequestOpenIDConnectConfig @@ -39,10 +41,13 @@ from .types import UpdateClusterRequestAutoscalerConfig from .types import UpdateClusterRequestOpenIDConnectConfig from .types import UpdatePoolRequestUpgradePolicy +from .types import AddClusterACLRulesRequest +from .types import AddClusterACLRulesResponse from .types import AuthExternalNodeRequest from .types import CreateClusterRequest from .types import CreateExternalNodeRequest from .types import CreatePoolRequest +from .types import DeleteACLRuleRequest from .types import DeleteClusterRequest from .types import DeleteNodeRequest from .types import DeletePoolRequest @@ -54,6 +59,8 @@ from .types import GetNodeRequest from .types import GetPoolRequest from .types import GetVersionRequest +from .types import ListClusterACLRulesRequest +from .types import ListClusterACLRulesResponse from .types import ListClusterAvailableTypesRequest from .types import ListClusterAvailableTypesResponse from .types import ListClusterAvailableVersionsRequest @@ -73,6 +80,8 @@ from .types import RebootNodeRequest from .types import ReplaceNodeRequest from .types import ResetClusterAdminTokenRequest +from .types import SetClusterACLRulesRequest +from .types import SetClusterACLRulesResponse from .types import SetClusterTypeRequest from .types import UpdateClusterRequest from .types import UpdatePoolRequest @@ -105,6 +114,8 @@ "ClusterAutoscalerConfig", "ClusterOpenIDConnectConfig", "Pool", + "ACLRuleRequest", + "ACLRule", "CreateClusterRequestAutoUpgrade", "CreateClusterRequestAutoscalerConfig", "CreateClusterRequestOpenIDConnectConfig", @@ -120,10 +131,13 @@ "UpdateClusterRequestAutoscalerConfig", "UpdateClusterRequestOpenIDConnectConfig", "UpdatePoolRequestUpgradePolicy", + "AddClusterACLRulesRequest", + "AddClusterACLRulesResponse", "AuthExternalNodeRequest", "CreateClusterRequest", "CreateExternalNodeRequest", "CreatePoolRequest", + "DeleteACLRuleRequest", "DeleteClusterRequest", "DeleteNodeRequest", "DeletePoolRequest", @@ -135,6 +149,8 @@ "GetNodeRequest", "GetPoolRequest", "GetVersionRequest", + "ListClusterACLRulesRequest", + "ListClusterACLRulesResponse", "ListClusterAvailableTypesRequest", "ListClusterAvailableTypesResponse", "ListClusterAvailableVersionsRequest", @@ -154,6 +170,8 @@ "RebootNodeRequest", "ReplaceNodeRequest", "ResetClusterAdminTokenRequest", + "SetClusterACLRulesRequest", + "SetClusterACLRulesResponse", "SetClusterTypeRequest", "UpdateClusterRequest", "UpdatePoolRequest", diff --git a/scaleway-async/scaleway_async/k8s/v1/api.py b/scaleway-async/scaleway_async/k8s/v1/api.py index 9ab8ae39b..50edcdb4f 100644 --- a/scaleway-async/scaleway_async/k8s/v1/api.py +++ b/scaleway-async/scaleway_async/k8s/v1/api.py @@ -27,6 +27,10 @@ PoolStatus, PoolVolumeType, Runtime, + ACLRule, + ACLRuleRequest, + AddClusterACLRulesRequest, + AddClusterACLRulesResponse, Cluster, ClusterType, CreateClusterRequest, @@ -38,6 +42,7 @@ CreatePoolRequestUpgradePolicy, ExternalNode, ExternalNodeAuth, + ListClusterACLRulesResponse, ListClusterAvailableTypesResponse, ListClusterAvailableVersionsResponse, ListClusterTypesResponse, @@ -48,6 +53,8 @@ Node, NodeMetadata, Pool, + SetClusterACLRulesRequest, + SetClusterACLRulesResponse, SetClusterTypeRequest, UpdateClusterRequest, UpdateClusterRequestAutoUpgrade, @@ -69,8 +76,10 @@ unmarshal_Version, unmarshal_Cluster, unmarshal_Node, + unmarshal_AddClusterACLRulesResponse, unmarshal_ExternalNode, unmarshal_ExternalNodeAuth, + unmarshal_ListClusterACLRulesResponse, unmarshal_ListClusterAvailableTypesResponse, unmarshal_ListClusterAvailableVersionsResponse, unmarshal_ListClusterTypesResponse, @@ -79,8 +88,11 @@ unmarshal_ListPoolsResponse, unmarshal_ListVersionsResponse, unmarshal_NodeMetadata, + unmarshal_SetClusterACLRulesResponse, + marshal_AddClusterACLRulesRequest, marshal_CreateClusterRequest, marshal_CreatePoolRequest, + marshal_SetClusterACLRulesRequest, marshal_SetClusterTypeRequest, marshal_UpdateClusterRequest, marshal_UpdatePoolRequest, @@ -749,6 +761,204 @@ async def migrate_cluster_to_sbscsi( self._throw_on_error(res) return unmarshal_Cluster(res.json()) + async def list_cluster_acl_rules( + self, + *, + cluster_id: str, + region: Optional[Region] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + ) -> ListClusterACLRulesResponse: + """ + List ACLs. + List ACLs for a specific cluster. + :param cluster_id: ID of the cluster whose ACLs will be listed. + :param region: Region to target. If none is passed will use default region from the config. + :param page: Page number for the returned ACLs. + :param page_size: Maximum number of ACLs per page. + :return: :class:`ListClusterACLRulesResponse ` + + Usage: + :: + + result = await api.list_cluster_acl_rules( + cluster_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_cluster_id = validate_path_param("cluster_id", cluster_id) + + res = self._request( + "GET", + f"/k8s/v1/regions/{param_region}/clusters/{param_cluster_id}/acls", + params={ + "page": page, + "page_size": page_size or self.client.default_page_size, + }, + ) + + self._throw_on_error(res) + return unmarshal_ListClusterACLRulesResponse(res.json()) + + async def list_cluster_acl_rules_all( + self, + *, + cluster_id: str, + region: Optional[Region] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ACLRule]: + """ + List ACLs. + List ACLs for a specific cluster. + :param cluster_id: ID of the cluster whose ACLs will be listed. + :param region: Region to target. If none is passed will use default region from the config. + :param page: Page number for the returned ACLs. + :param page_size: Maximum number of ACLs per page. + :return: :class:`List[ACLRule] ` + + Usage: + :: + + result = await api.list_cluster_acl_rules_all( + cluster_id="example", + ) + """ + + return await fetch_all_pages_async( + type=ListClusterACLRulesResponse, + key="rules", + fetcher=self.list_cluster_acl_rules, + args={ + "cluster_id": cluster_id, + "region": region, + "page": page, + "page_size": page_size, + }, + ) + + async def add_cluster_acl_rules( + self, + *, + cluster_id: str, + region: Optional[Region] = None, + acls: Optional[List[ACLRuleRequest]] = None, + ) -> AddClusterACLRulesResponse: + """ + Add new ACLs. + Add new ACL rules for a specific cluster. + :param cluster_id: ID of the cluster whose ACLs will be added. + :param region: Region to target. If none is passed will use default region from the config. + :param acls: ACLs to add. + :return: :class:`AddClusterACLRulesResponse ` + + Usage: + :: + + result = await api.add_cluster_acl_rules( + cluster_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_cluster_id = validate_path_param("cluster_id", cluster_id) + + res = self._request( + "POST", + f"/k8s/v1/regions/{param_region}/clusters/{param_cluster_id}/acls", + body=marshal_AddClusterACLRulesRequest( + AddClusterACLRulesRequest( + cluster_id=cluster_id, + region=region, + acls=acls, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_AddClusterACLRulesResponse(res.json()) + + async def set_cluster_acl_rules( + self, + *, + cluster_id: str, + region: Optional[Region] = None, + acls: Optional[List[ACLRuleRequest]] = None, + ) -> SetClusterACLRulesResponse: + """ + Set new ACLs. + Set new ACL rules for a specific cluster. + :param cluster_id: ID of the cluster whose ACLs will be set. + :param region: Region to target. If none is passed will use default region from the config. + :param acls: ACLs to set. + :return: :class:`SetClusterACLRulesResponse ` + + Usage: + :: + + result = await api.set_cluster_acl_rules( + cluster_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_cluster_id = validate_path_param("cluster_id", cluster_id) + + res = self._request( + "PUT", + f"/k8s/v1/regions/{param_region}/clusters/{param_cluster_id}/acls", + body=marshal_SetClusterACLRulesRequest( + SetClusterACLRulesRequest( + cluster_id=cluster_id, + region=region, + acls=acls, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_SetClusterACLRulesResponse(res.json()) + + async def delete_acl_rule( + self, + *, + acl_id: str, + region: Optional[Region] = None, + ) -> None: + """ + Delete an existing ACL. + :param acl_id: ID of the ACL rule to delete. + :param region: Region to target. If none is passed will use default region from the config. + + Usage: + :: + + result = await api.delete_acl_rule( + acl_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_acl_id = validate_path_param("acl_id", acl_id) + + res = self._request( + "DELETE", + f"/k8s/v1/regions/{param_region}/acls/{param_acl_id}", + ) + + self._throw_on_error(res) + async def list_pools( self, *, diff --git a/scaleway-async/scaleway_async/k8s/v1/marshalling.py b/scaleway-async/scaleway_async/k8s/v1/marshalling.py index 26991b89c..1095ed9ca 100644 --- a/scaleway-async/scaleway_async/k8s/v1/marshalling.py +++ b/scaleway-async/scaleway_async/k8s/v1/marshalling.py @@ -21,9 +21,12 @@ ClusterOpenIDConnectConfig, Cluster, Node, + ACLRule, + AddClusterACLRulesResponse, ExternalNodeCoreV1Taint, ExternalNode, ExternalNodeAuth, + ListClusterACLRulesResponse, ClusterType, ListClusterAvailableTypesResponse, ListClusterAvailableVersionsResponse, @@ -34,6 +37,9 @@ ListVersionsResponse, NodeMetadataCoreV1Taint, NodeMetadata, + SetClusterACLRulesResponse, + ACLRuleRequest, + AddClusterACLRulesRequest, CreateClusterRequestPoolConfigUpgradePolicy, CreateClusterRequestAutoUpgrade, CreateClusterRequestAutoscalerConfig, @@ -42,6 +48,7 @@ CreateClusterRequest, CreatePoolRequestUpgradePolicy, CreatePoolRequest, + SetClusterACLRulesRequest, SetClusterTypeRequest, UpdateClusterRequestAutoUpgrade, UpdateClusterRequestAutoscalerConfig, @@ -577,6 +584,54 @@ def unmarshal_Node(data: Any) -> Node: return Node(**args) +def unmarshal_ACLRule(data: Any) -> ACLRule: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ACLRule' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("id", None) + if field is not None: + args["id"] = field + + field = data.get("description", None) + if field is not None: + args["description"] = field + + field = data.get("ip", None) + if field is not None: + args["ip"] = field + else: + args["ip"] = None + + field = data.get("scaleway_ranges", None) + if field is not None: + args["scaleway_ranges"] = field + else: + args["scaleway_ranges"] = None + + return ACLRule(**args) + + +def unmarshal_AddClusterACLRulesResponse(data: Any) -> AddClusterACLRulesResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'AddClusterACLRulesResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("rules", None) + if field is not None: + args["rules"] = ( + [unmarshal_ACLRule(v) for v in field] if field is not None else None + ) + + return AddClusterACLRulesResponse(**args) + + def unmarshal_ExternalNodeCoreV1Taint(data: Any) -> ExternalNodeCoreV1Taint: if not isinstance(data, dict): raise TypeError( @@ -686,6 +741,27 @@ def unmarshal_ExternalNodeAuth(data: Any) -> ExternalNodeAuth: return ExternalNodeAuth(**args) +def unmarshal_ListClusterACLRulesResponse(data: Any) -> ListClusterACLRulesResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ListClusterACLRulesResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("total_count", None) + if field is not None: + args["total_count"] = field + + field = data.get("rules", None) + if field is not None: + args["rules"] = ( + [unmarshal_ACLRule(v) for v in field] if field is not None else None + ) + + return ListClusterACLRulesResponse(**args) + + def unmarshal_ClusterType(data: Any) -> ClusterType: if not isinstance(data, dict): raise TypeError( @@ -976,6 +1052,57 @@ def unmarshal_NodeMetadata(data: Any) -> NodeMetadata: return NodeMetadata(**args) +def unmarshal_SetClusterACLRulesResponse(data: Any) -> SetClusterACLRulesResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'SetClusterACLRulesResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("rules", None) + if field is not None: + args["rules"] = ( + [unmarshal_ACLRule(v) for v in field] if field is not None else None + ) + + return SetClusterACLRulesResponse(**args) + + +def marshal_ACLRuleRequest( + request: ACLRuleRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + output.update( + resolve_one_of( + [ + OneOfPossibility("ip", request.ip), + OneOfPossibility("scaleway_ranges", request.scaleway_ranges), + ] + ), + ) + + if request.description is not None: + output["description"] = request.description + + return output + + +def marshal_AddClusterACLRulesRequest( + request: AddClusterACLRulesRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.acls is not None: + output["acls"] = [ + marshal_ACLRuleRequest(item, defaults) for item in request.acls + ] + + return output + + def marshal_MaintenanceWindow( request: MaintenanceWindow, defaults: ProfileDefaults, @@ -1309,6 +1436,20 @@ def marshal_CreatePoolRequest( return output +def marshal_SetClusterACLRulesRequest( + request: SetClusterACLRulesRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.acls is not None: + output["acls"] = [ + marshal_ACLRuleRequest(item, defaults) for item in request.acls + ] + + return output + + def marshal_SetClusterTypeRequest( request: SetClusterTypeRequest, defaults: ProfileDefaults, diff --git a/scaleway-async/scaleway_async/k8s/v1/types.py b/scaleway-async/scaleway_async/k8s/v1/types.py index 6d1944b53..2df9f07b3 100644 --- a/scaleway-async/scaleway_async/k8s/v1/types.py +++ b/scaleway-async/scaleway_async/k8s/v1/types.py @@ -441,6 +441,35 @@ class Pool: """ +@dataclass +class ACLRuleRequest: + description: str + """ + Description of the ACL. + """ + + ip: Optional[str] + + scaleway_ranges: Optional[bool] + + +@dataclass +class ACLRule: + id: str + """ + ID of the ACL rule. + """ + + description: str + """ + Description of the ACL. + """ + + ip: Optional[str] + + scaleway_ranges: Optional[bool] + + @dataclass class CreateClusterRequestAutoUpgrade: enable: bool @@ -1066,6 +1095,32 @@ class UpdatePoolRequestUpgradePolicy: max_surge: Optional[int] +@dataclass +class AddClusterACLRulesRequest: + cluster_id: str + """ + ID of the cluster whose ACLs will be added. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + acls: Optional[List[ACLRuleRequest]] + """ + ACLs to add. + """ + + +@dataclass +class AddClusterACLRulesResponse: + rules: List[ACLRule] + """ + ACLs that were added. + """ + + @dataclass class AuthExternalNodeRequest: pool_id: str @@ -1264,6 +1319,19 @@ class CreatePoolRequest: """ +@dataclass +class DeleteACLRuleRequest: + acl_id: str + """ + ID of the ACL rule to delete. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + @dataclass class DeleteClusterRequest: cluster_id: str @@ -1432,6 +1500,42 @@ class GetVersionRequest: """ +@dataclass +class ListClusterACLRulesRequest: + cluster_id: str + """ + ID of the cluster whose ACLs will be listed. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + page: Optional[int] + """ + Page number for the returned ACLs. + """ + + page_size: Optional[int] + """ + Maximum number of ACLs per page. + """ + + +@dataclass +class ListClusterACLRulesResponse: + total_count: int + """ + Total number of ACLs that exist for the cluster. + """ + + rules: List[ACLRule] + """ + Paginated returned ACLs. + """ + + @dataclass class ListClusterAvailableTypesRequest: cluster_id: str @@ -1782,6 +1886,32 @@ class ResetClusterAdminTokenRequest: """ +@dataclass +class SetClusterACLRulesRequest: + cluster_id: str + """ + ID of the cluster whose ACLs will be set. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + acls: Optional[List[ACLRuleRequest]] + """ + ACLs to set. + """ + + +@dataclass +class SetClusterACLRulesResponse: + rules: List[ACLRule] + """ + ACLs that were set. + """ + + @dataclass class SetClusterTypeRequest: cluster_id: str diff --git a/scaleway/scaleway/k8s/v1/__init__.py b/scaleway/scaleway/k8s/v1/__init__.py index f27274871..6a088ca7f 100644 --- a/scaleway/scaleway/k8s/v1/__init__.py +++ b/scaleway/scaleway/k8s/v1/__init__.py @@ -24,6 +24,8 @@ from .types import ClusterAutoscalerConfig from .types import ClusterOpenIDConnectConfig from .types import Pool +from .types import ACLRuleRequest +from .types import ACLRule from .types import CreateClusterRequestAutoUpgrade from .types import CreateClusterRequestAutoscalerConfig from .types import CreateClusterRequestOpenIDConnectConfig @@ -39,10 +41,13 @@ from .types import UpdateClusterRequestAutoscalerConfig from .types import UpdateClusterRequestOpenIDConnectConfig from .types import UpdatePoolRequestUpgradePolicy +from .types import AddClusterACLRulesRequest +from .types import AddClusterACLRulesResponse from .types import AuthExternalNodeRequest from .types import CreateClusterRequest from .types import CreateExternalNodeRequest from .types import CreatePoolRequest +from .types import DeleteACLRuleRequest from .types import DeleteClusterRequest from .types import DeleteNodeRequest from .types import DeletePoolRequest @@ -54,6 +59,8 @@ from .types import GetNodeRequest from .types import GetPoolRequest from .types import GetVersionRequest +from .types import ListClusterACLRulesRequest +from .types import ListClusterACLRulesResponse from .types import ListClusterAvailableTypesRequest from .types import ListClusterAvailableTypesResponse from .types import ListClusterAvailableVersionsRequest @@ -73,6 +80,8 @@ from .types import RebootNodeRequest from .types import ReplaceNodeRequest from .types import ResetClusterAdminTokenRequest +from .types import SetClusterACLRulesRequest +from .types import SetClusterACLRulesResponse from .types import SetClusterTypeRequest from .types import UpdateClusterRequest from .types import UpdatePoolRequest @@ -105,6 +114,8 @@ "ClusterAutoscalerConfig", "ClusterOpenIDConnectConfig", "Pool", + "ACLRuleRequest", + "ACLRule", "CreateClusterRequestAutoUpgrade", "CreateClusterRequestAutoscalerConfig", "CreateClusterRequestOpenIDConnectConfig", @@ -120,10 +131,13 @@ "UpdateClusterRequestAutoscalerConfig", "UpdateClusterRequestOpenIDConnectConfig", "UpdatePoolRequestUpgradePolicy", + "AddClusterACLRulesRequest", + "AddClusterACLRulesResponse", "AuthExternalNodeRequest", "CreateClusterRequest", "CreateExternalNodeRequest", "CreatePoolRequest", + "DeleteACLRuleRequest", "DeleteClusterRequest", "DeleteNodeRequest", "DeletePoolRequest", @@ -135,6 +149,8 @@ "GetNodeRequest", "GetPoolRequest", "GetVersionRequest", + "ListClusterACLRulesRequest", + "ListClusterACLRulesResponse", "ListClusterAvailableTypesRequest", "ListClusterAvailableTypesResponse", "ListClusterAvailableVersionsRequest", @@ -154,6 +170,8 @@ "RebootNodeRequest", "ReplaceNodeRequest", "ResetClusterAdminTokenRequest", + "SetClusterACLRulesRequest", + "SetClusterACLRulesResponse", "SetClusterTypeRequest", "UpdateClusterRequest", "UpdatePoolRequest", diff --git a/scaleway/scaleway/k8s/v1/api.py b/scaleway/scaleway/k8s/v1/api.py index 7ed4433ed..e0270bac6 100644 --- a/scaleway/scaleway/k8s/v1/api.py +++ b/scaleway/scaleway/k8s/v1/api.py @@ -27,6 +27,10 @@ PoolStatus, PoolVolumeType, Runtime, + ACLRule, + ACLRuleRequest, + AddClusterACLRulesRequest, + AddClusterACLRulesResponse, Cluster, ClusterType, CreateClusterRequest, @@ -38,6 +42,7 @@ CreatePoolRequestUpgradePolicy, ExternalNode, ExternalNodeAuth, + ListClusterACLRulesResponse, ListClusterAvailableTypesResponse, ListClusterAvailableVersionsResponse, ListClusterTypesResponse, @@ -48,6 +53,8 @@ Node, NodeMetadata, Pool, + SetClusterACLRulesRequest, + SetClusterACLRulesResponse, SetClusterTypeRequest, UpdateClusterRequest, UpdateClusterRequestAutoUpgrade, @@ -69,8 +76,10 @@ unmarshal_Version, unmarshal_Cluster, unmarshal_Node, + unmarshal_AddClusterACLRulesResponse, unmarshal_ExternalNode, unmarshal_ExternalNodeAuth, + unmarshal_ListClusterACLRulesResponse, unmarshal_ListClusterAvailableTypesResponse, unmarshal_ListClusterAvailableVersionsResponse, unmarshal_ListClusterTypesResponse, @@ -79,8 +88,11 @@ unmarshal_ListPoolsResponse, unmarshal_ListVersionsResponse, unmarshal_NodeMetadata, + unmarshal_SetClusterACLRulesResponse, + marshal_AddClusterACLRulesRequest, marshal_CreateClusterRequest, marshal_CreatePoolRequest, + marshal_SetClusterACLRulesRequest, marshal_SetClusterTypeRequest, marshal_UpdateClusterRequest, marshal_UpdatePoolRequest, @@ -749,6 +761,204 @@ def migrate_cluster_to_sbscsi( self._throw_on_error(res) return unmarshal_Cluster(res.json()) + def list_cluster_acl_rules( + self, + *, + cluster_id: str, + region: Optional[Region] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + ) -> ListClusterACLRulesResponse: + """ + List ACLs. + List ACLs for a specific cluster. + :param cluster_id: ID of the cluster whose ACLs will be listed. + :param region: Region to target. If none is passed will use default region from the config. + :param page: Page number for the returned ACLs. + :param page_size: Maximum number of ACLs per page. + :return: :class:`ListClusterACLRulesResponse ` + + Usage: + :: + + result = api.list_cluster_acl_rules( + cluster_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_cluster_id = validate_path_param("cluster_id", cluster_id) + + res = self._request( + "GET", + f"/k8s/v1/regions/{param_region}/clusters/{param_cluster_id}/acls", + params={ + "page": page, + "page_size": page_size or self.client.default_page_size, + }, + ) + + self._throw_on_error(res) + return unmarshal_ListClusterACLRulesResponse(res.json()) + + def list_cluster_acl_rules_all( + self, + *, + cluster_id: str, + region: Optional[Region] = None, + page: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ACLRule]: + """ + List ACLs. + List ACLs for a specific cluster. + :param cluster_id: ID of the cluster whose ACLs will be listed. + :param region: Region to target. If none is passed will use default region from the config. + :param page: Page number for the returned ACLs. + :param page_size: Maximum number of ACLs per page. + :return: :class:`List[ACLRule] ` + + Usage: + :: + + result = api.list_cluster_acl_rules_all( + cluster_id="example", + ) + """ + + return fetch_all_pages( + type=ListClusterACLRulesResponse, + key="rules", + fetcher=self.list_cluster_acl_rules, + args={ + "cluster_id": cluster_id, + "region": region, + "page": page, + "page_size": page_size, + }, + ) + + def add_cluster_acl_rules( + self, + *, + cluster_id: str, + region: Optional[Region] = None, + acls: Optional[List[ACLRuleRequest]] = None, + ) -> AddClusterACLRulesResponse: + """ + Add new ACLs. + Add new ACL rules for a specific cluster. + :param cluster_id: ID of the cluster whose ACLs will be added. + :param region: Region to target. If none is passed will use default region from the config. + :param acls: ACLs to add. + :return: :class:`AddClusterACLRulesResponse ` + + Usage: + :: + + result = api.add_cluster_acl_rules( + cluster_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_cluster_id = validate_path_param("cluster_id", cluster_id) + + res = self._request( + "POST", + f"/k8s/v1/regions/{param_region}/clusters/{param_cluster_id}/acls", + body=marshal_AddClusterACLRulesRequest( + AddClusterACLRulesRequest( + cluster_id=cluster_id, + region=region, + acls=acls, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_AddClusterACLRulesResponse(res.json()) + + def set_cluster_acl_rules( + self, + *, + cluster_id: str, + region: Optional[Region] = None, + acls: Optional[List[ACLRuleRequest]] = None, + ) -> SetClusterACLRulesResponse: + """ + Set new ACLs. + Set new ACL rules for a specific cluster. + :param cluster_id: ID of the cluster whose ACLs will be set. + :param region: Region to target. If none is passed will use default region from the config. + :param acls: ACLs to set. + :return: :class:`SetClusterACLRulesResponse ` + + Usage: + :: + + result = api.set_cluster_acl_rules( + cluster_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_cluster_id = validate_path_param("cluster_id", cluster_id) + + res = self._request( + "PUT", + f"/k8s/v1/regions/{param_region}/clusters/{param_cluster_id}/acls", + body=marshal_SetClusterACLRulesRequest( + SetClusterACLRulesRequest( + cluster_id=cluster_id, + region=region, + acls=acls, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_SetClusterACLRulesResponse(res.json()) + + def delete_acl_rule( + self, + *, + acl_id: str, + region: Optional[Region] = None, + ) -> None: + """ + Delete an existing ACL. + :param acl_id: ID of the ACL rule to delete. + :param region: Region to target. If none is passed will use default region from the config. + + Usage: + :: + + result = api.delete_acl_rule( + acl_id="example", + ) + """ + + param_region = validate_path_param( + "region", region or self.client.default_region + ) + param_acl_id = validate_path_param("acl_id", acl_id) + + res = self._request( + "DELETE", + f"/k8s/v1/regions/{param_region}/acls/{param_acl_id}", + ) + + self._throw_on_error(res) + def list_pools( self, *, diff --git a/scaleway/scaleway/k8s/v1/marshalling.py b/scaleway/scaleway/k8s/v1/marshalling.py index 26991b89c..1095ed9ca 100644 --- a/scaleway/scaleway/k8s/v1/marshalling.py +++ b/scaleway/scaleway/k8s/v1/marshalling.py @@ -21,9 +21,12 @@ ClusterOpenIDConnectConfig, Cluster, Node, + ACLRule, + AddClusterACLRulesResponse, ExternalNodeCoreV1Taint, ExternalNode, ExternalNodeAuth, + ListClusterACLRulesResponse, ClusterType, ListClusterAvailableTypesResponse, ListClusterAvailableVersionsResponse, @@ -34,6 +37,9 @@ ListVersionsResponse, NodeMetadataCoreV1Taint, NodeMetadata, + SetClusterACLRulesResponse, + ACLRuleRequest, + AddClusterACLRulesRequest, CreateClusterRequestPoolConfigUpgradePolicy, CreateClusterRequestAutoUpgrade, CreateClusterRequestAutoscalerConfig, @@ -42,6 +48,7 @@ CreateClusterRequest, CreatePoolRequestUpgradePolicy, CreatePoolRequest, + SetClusterACLRulesRequest, SetClusterTypeRequest, UpdateClusterRequestAutoUpgrade, UpdateClusterRequestAutoscalerConfig, @@ -577,6 +584,54 @@ def unmarshal_Node(data: Any) -> Node: return Node(**args) +def unmarshal_ACLRule(data: Any) -> ACLRule: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ACLRule' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("id", None) + if field is not None: + args["id"] = field + + field = data.get("description", None) + if field is not None: + args["description"] = field + + field = data.get("ip", None) + if field is not None: + args["ip"] = field + else: + args["ip"] = None + + field = data.get("scaleway_ranges", None) + if field is not None: + args["scaleway_ranges"] = field + else: + args["scaleway_ranges"] = None + + return ACLRule(**args) + + +def unmarshal_AddClusterACLRulesResponse(data: Any) -> AddClusterACLRulesResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'AddClusterACLRulesResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("rules", None) + if field is not None: + args["rules"] = ( + [unmarshal_ACLRule(v) for v in field] if field is not None else None + ) + + return AddClusterACLRulesResponse(**args) + + def unmarshal_ExternalNodeCoreV1Taint(data: Any) -> ExternalNodeCoreV1Taint: if not isinstance(data, dict): raise TypeError( @@ -686,6 +741,27 @@ def unmarshal_ExternalNodeAuth(data: Any) -> ExternalNodeAuth: return ExternalNodeAuth(**args) +def unmarshal_ListClusterACLRulesResponse(data: Any) -> ListClusterACLRulesResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ListClusterACLRulesResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("total_count", None) + if field is not None: + args["total_count"] = field + + field = data.get("rules", None) + if field is not None: + args["rules"] = ( + [unmarshal_ACLRule(v) for v in field] if field is not None else None + ) + + return ListClusterACLRulesResponse(**args) + + def unmarshal_ClusterType(data: Any) -> ClusterType: if not isinstance(data, dict): raise TypeError( @@ -976,6 +1052,57 @@ def unmarshal_NodeMetadata(data: Any) -> NodeMetadata: return NodeMetadata(**args) +def unmarshal_SetClusterACLRulesResponse(data: Any) -> SetClusterACLRulesResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'SetClusterACLRulesResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("rules", None) + if field is not None: + args["rules"] = ( + [unmarshal_ACLRule(v) for v in field] if field is not None else None + ) + + return SetClusterACLRulesResponse(**args) + + +def marshal_ACLRuleRequest( + request: ACLRuleRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + output.update( + resolve_one_of( + [ + OneOfPossibility("ip", request.ip), + OneOfPossibility("scaleway_ranges", request.scaleway_ranges), + ] + ), + ) + + if request.description is not None: + output["description"] = request.description + + return output + + +def marshal_AddClusterACLRulesRequest( + request: AddClusterACLRulesRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.acls is not None: + output["acls"] = [ + marshal_ACLRuleRequest(item, defaults) for item in request.acls + ] + + return output + + def marshal_MaintenanceWindow( request: MaintenanceWindow, defaults: ProfileDefaults, @@ -1309,6 +1436,20 @@ def marshal_CreatePoolRequest( return output +def marshal_SetClusterACLRulesRequest( + request: SetClusterACLRulesRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.acls is not None: + output["acls"] = [ + marshal_ACLRuleRequest(item, defaults) for item in request.acls + ] + + return output + + def marshal_SetClusterTypeRequest( request: SetClusterTypeRequest, defaults: ProfileDefaults, diff --git a/scaleway/scaleway/k8s/v1/types.py b/scaleway/scaleway/k8s/v1/types.py index 6d1944b53..2df9f07b3 100644 --- a/scaleway/scaleway/k8s/v1/types.py +++ b/scaleway/scaleway/k8s/v1/types.py @@ -441,6 +441,35 @@ class Pool: """ +@dataclass +class ACLRuleRequest: + description: str + """ + Description of the ACL. + """ + + ip: Optional[str] + + scaleway_ranges: Optional[bool] + + +@dataclass +class ACLRule: + id: str + """ + ID of the ACL rule. + """ + + description: str + """ + Description of the ACL. + """ + + ip: Optional[str] + + scaleway_ranges: Optional[bool] + + @dataclass class CreateClusterRequestAutoUpgrade: enable: bool @@ -1066,6 +1095,32 @@ class UpdatePoolRequestUpgradePolicy: max_surge: Optional[int] +@dataclass +class AddClusterACLRulesRequest: + cluster_id: str + """ + ID of the cluster whose ACLs will be added. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + acls: Optional[List[ACLRuleRequest]] + """ + ACLs to add. + """ + + +@dataclass +class AddClusterACLRulesResponse: + rules: List[ACLRule] + """ + ACLs that were added. + """ + + @dataclass class AuthExternalNodeRequest: pool_id: str @@ -1264,6 +1319,19 @@ class CreatePoolRequest: """ +@dataclass +class DeleteACLRuleRequest: + acl_id: str + """ + ID of the ACL rule to delete. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + @dataclass class DeleteClusterRequest: cluster_id: str @@ -1432,6 +1500,42 @@ class GetVersionRequest: """ +@dataclass +class ListClusterACLRulesRequest: + cluster_id: str + """ + ID of the cluster whose ACLs will be listed. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + page: Optional[int] + """ + Page number for the returned ACLs. + """ + + page_size: Optional[int] + """ + Maximum number of ACLs per page. + """ + + +@dataclass +class ListClusterACLRulesResponse: + total_count: int + """ + Total number of ACLs that exist for the cluster. + """ + + rules: List[ACLRule] + """ + Paginated returned ACLs. + """ + + @dataclass class ListClusterAvailableTypesRequest: cluster_id: str @@ -1782,6 +1886,32 @@ class ResetClusterAdminTokenRequest: """ +@dataclass +class SetClusterACLRulesRequest: + cluster_id: str + """ + ID of the cluster whose ACLs will be set. + """ + + region: Optional[Region] + """ + Region to target. If none is passed will use default region from the config. + """ + + acls: Optional[List[ACLRuleRequest]] + """ + ACLs to set. + """ + + +@dataclass +class SetClusterACLRulesResponse: + rules: List[ACLRule] + """ + ACLs that were set. + """ + + @dataclass class SetClusterTypeRequest: cluster_id: str