Skip to content

Commit 10dc0fd

Browse files
feat(k8s): add support for GetNodeMetadata (scaleway#612)
Co-authored-by: Laure-di <[email protected]>
1 parent d4bde70 commit 10dc0fd

File tree

8 files changed

+524
-0
lines changed

8 files changed

+524
-0
lines changed

scaleway-async/scaleway_async/k8s/v1/__init__.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,19 +34,23 @@
3434
from .types import Version
3535
from .types import Cluster
3636
from .types import Node
37+
from .types import NodeMetadataCoreV1Taint
3738
from .types import UpdateClusterRequestAutoUpgrade
3839
from .types import UpdateClusterRequestAutoscalerConfig
3940
from .types import UpdateClusterRequestOpenIDConnectConfig
4041
from .types import UpdatePoolRequestUpgradePolicy
42+
from .types import AuthExternalNodeRequest
4143
from .types import CreateClusterRequest
4244
from .types import CreateExternalNodeRequest
4345
from .types import CreatePoolRequest
4446
from .types import DeleteClusterRequest
4547
from .types import DeleteNodeRequest
4648
from .types import DeletePoolRequest
4749
from .types import ExternalNode
50+
from .types import ExternalNodeAuth
4851
from .types import GetClusterKubeConfigRequest
4952
from .types import GetClusterRequest
53+
from .types import GetNodeMetadataRequest
5054
from .types import GetNodeRequest
5155
from .types import GetPoolRequest
5256
from .types import GetVersionRequest
@@ -65,6 +69,7 @@
6569
from .types import ListVersionsRequest
6670
from .types import ListVersionsResponse
6771
from .types import MigrateClusterToRoutedIPsRequest
72+
from .types import NodeMetadata
6873
from .types import RebootNodeRequest
6974
from .types import ReplaceNodeRequest
7075
from .types import ResetClusterAdminTokenRequest
@@ -110,19 +115,23 @@
110115
"Version",
111116
"Cluster",
112117
"Node",
118+
"NodeMetadataCoreV1Taint",
113119
"UpdateClusterRequestAutoUpgrade",
114120
"UpdateClusterRequestAutoscalerConfig",
115121
"UpdateClusterRequestOpenIDConnectConfig",
116122
"UpdatePoolRequestUpgradePolicy",
123+
"AuthExternalNodeRequest",
117124
"CreateClusterRequest",
118125
"CreateExternalNodeRequest",
119126
"CreatePoolRequest",
120127
"DeleteClusterRequest",
121128
"DeleteNodeRequest",
122129
"DeletePoolRequest",
123130
"ExternalNode",
131+
"ExternalNodeAuth",
124132
"GetClusterKubeConfigRequest",
125133
"GetClusterRequest",
134+
"GetNodeMetadataRequest",
126135
"GetNodeRequest",
127136
"GetPoolRequest",
128137
"GetVersionRequest",
@@ -141,6 +150,7 @@
141150
"ListVersionsRequest",
142151
"ListVersionsResponse",
143152
"MigrateClusterToRoutedIPsRequest",
153+
"NodeMetadata",
144154
"RebootNodeRequest",
145155
"ReplaceNodeRequest",
146156
"ResetClusterAdminTokenRequest",

scaleway-async/scaleway_async/k8s/v1/api.py

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
CreatePoolRequest,
3838
CreatePoolRequestUpgradePolicy,
3939
ExternalNode,
40+
ExternalNodeAuth,
4041
ListClusterAvailableTypesResponse,
4142
ListClusterAvailableVersionsResponse,
4243
ListClusterTypesResponse,
@@ -45,6 +46,7 @@
4546
ListPoolsResponse,
4647
ListVersionsResponse,
4748
Node,
49+
NodeMetadata,
4850
Pool,
4951
SetClusterTypeRequest,
5052
UpdateClusterRequest,
@@ -68,13 +70,15 @@
6870
unmarshal_Cluster,
6971
unmarshal_Node,
7072
unmarshal_ExternalNode,
73+
unmarshal_ExternalNodeAuth,
7174
unmarshal_ListClusterAvailableTypesResponse,
7275
unmarshal_ListClusterAvailableVersionsResponse,
7376
unmarshal_ListClusterTypesResponse,
7477
unmarshal_ListClustersResponse,
7578
unmarshal_ListNodesResponse,
7679
unmarshal_ListPoolsResponse,
7780
unmarshal_ListVersionsResponse,
81+
unmarshal_NodeMetadata,
7882
marshal_CreateClusterRequest,
7983
marshal_CreatePoolRequest,
8084
marshal_SetClusterTypeRequest,
@@ -1151,6 +1155,70 @@ async def delete_pool(
11511155
self._throw_on_error(res)
11521156
return unmarshal_Pool(res.json())
11531157

1158+
async def get_node_metadata(
1159+
self,
1160+
*,
1161+
region: Optional[Region] = None,
1162+
) -> NodeMetadata:
1163+
"""
1164+
Fetch node metadata.
1165+
Rerieve metadata to instantiate a Kapsule/Kosmos node. This method is not intended to be called by end users but rather programmatically by the node-installer.
1166+
:param region: Region to target. If none is passed will use default region from the config.
1167+
:return: :class:`NodeMetadata <NodeMetadata>`
1168+
1169+
Usage:
1170+
::
1171+
1172+
result = await api.get_node_metadata()
1173+
"""
1174+
1175+
param_region = validate_path_param(
1176+
"region", region or self.client.default_region
1177+
)
1178+
1179+
res = self._request(
1180+
"GET",
1181+
f"/k8s/v1/regions/{param_region}/nodes/metadata",
1182+
)
1183+
1184+
self._throw_on_error(res)
1185+
return unmarshal_NodeMetadata(res.json())
1186+
1187+
async def auth_external_node(
1188+
self,
1189+
*,
1190+
pool_id: str,
1191+
region: Optional[Region] = None,
1192+
) -> ExternalNodeAuth:
1193+
"""
1194+
Authenticate Kosmos external node.
1195+
Creates a newer Kosmos node and returns its token. This method is not intended to be called by end users but rather programmatically by the node-installer.
1196+
:param pool_id: Pool the node will be attached to.
1197+
:param region: Region to target. If none is passed will use default region from the config.
1198+
:return: :class:`ExternalNodeAuth <ExternalNodeAuth>`
1199+
1200+
Usage:
1201+
::
1202+
1203+
result = await api.auth_external_node(
1204+
pool_id="example",
1205+
)
1206+
"""
1207+
1208+
param_region = validate_path_param(
1209+
"region", region or self.client.default_region
1210+
)
1211+
param_pool_id = validate_path_param("pool_id", pool_id)
1212+
1213+
res = self._request(
1214+
"POST",
1215+
f"/k8s/v1/regions/{param_region}/pools/{param_pool_id}/external-nodes/auth",
1216+
body={},
1217+
)
1218+
1219+
self._throw_on_error(res)
1220+
return unmarshal_ExternalNodeAuth(res.json())
1221+
11541222
async def create_external_node(
11551223
self,
11561224
*,

scaleway-async/scaleway_async/k8s/v1/marshalling.py

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
Node,
2424
ExternalNodeCoreV1Taint,
2525
ExternalNode,
26+
ExternalNodeAuth,
2627
ClusterType,
2728
ListClusterAvailableTypesResponse,
2829
ListClusterAvailableVersionsResponse,
@@ -31,6 +32,8 @@
3132
ListNodesResponse,
3233
ListPoolsResponse,
3334
ListVersionsResponse,
35+
NodeMetadataCoreV1Taint,
36+
NodeMetadata,
3437
CreateClusterRequestPoolConfigUpgradePolicy,
3538
CreateClusterRequestAutoUpgrade,
3639
CreateClusterRequestAutoscalerConfig,
@@ -652,6 +655,25 @@ def unmarshal_ExternalNode(data: Any) -> ExternalNode:
652655
return ExternalNode(**args)
653656

654657

658+
def unmarshal_ExternalNodeAuth(data: Any) -> ExternalNodeAuth:
659+
if not isinstance(data, dict):
660+
raise TypeError(
661+
"Unmarshalling the type 'ExternalNodeAuth' failed as data isn't a dictionary."
662+
)
663+
664+
args: Dict[str, Any] = {}
665+
666+
field = data.get("node_token", None)
667+
if field is not None:
668+
args["node_token"] = field
669+
670+
field = data.get("api_url", None)
671+
if field is not None:
672+
args["api_url"] = field
673+
674+
return ExternalNodeAuth(**args)
675+
676+
655677
def unmarshal_ClusterType(data: Any) -> ClusterType:
656678
if not isinstance(data, dict):
657679
raise TypeError(
@@ -844,6 +866,100 @@ def unmarshal_ListVersionsResponse(data: Any) -> ListVersionsResponse:
844866
return ListVersionsResponse(**args)
845867

846868

869+
def unmarshal_NodeMetadataCoreV1Taint(data: Any) -> NodeMetadataCoreV1Taint:
870+
if not isinstance(data, dict):
871+
raise TypeError(
872+
"Unmarshalling the type 'NodeMetadataCoreV1Taint' failed as data isn't a dictionary."
873+
)
874+
875+
args: Dict[str, Any] = {}
876+
877+
field = data.get("key", None)
878+
if field is not None:
879+
args["key"] = field
880+
881+
field = data.get("value", None)
882+
if field is not None:
883+
args["value"] = field
884+
885+
field = data.get("effect", None)
886+
if field is not None:
887+
args["effect"] = field
888+
889+
return NodeMetadataCoreV1Taint(**args)
890+
891+
892+
def unmarshal_NodeMetadata(data: Any) -> NodeMetadata:
893+
if not isinstance(data, dict):
894+
raise TypeError(
895+
"Unmarshalling the type 'NodeMetadata' failed as data isn't a dictionary."
896+
)
897+
898+
args: Dict[str, Any] = {}
899+
900+
field = data.get("id", None)
901+
if field is not None:
902+
args["id"] = field
903+
904+
field = data.get("name", None)
905+
if field is not None:
906+
args["name"] = field
907+
908+
field = data.get("cluster_url", None)
909+
if field is not None:
910+
args["cluster_url"] = field
911+
912+
field = data.get("cluster_ca", None)
913+
if field is not None:
914+
args["cluster_ca"] = field
915+
916+
field = data.get("credential_provider_config", None)
917+
if field is not None:
918+
args["credential_provider_config"] = field
919+
920+
field = data.get("pool_version", None)
921+
if field is not None:
922+
args["pool_version"] = field
923+
924+
field = data.get("kubelet_config", None)
925+
if field is not None:
926+
args["kubelet_config"] = field
927+
928+
field = data.get("node_labels", None)
929+
if field is not None:
930+
args["node_labels"] = field
931+
932+
field = data.get("node_taints", None)
933+
if field is not None:
934+
args["node_taints"] = (
935+
[unmarshal_NodeMetadataCoreV1Taint(v) for v in field]
936+
if field is not None
937+
else None
938+
)
939+
940+
field = data.get("private_network_mode", None)
941+
if field is not None:
942+
args["private_network_mode"] = field
943+
944+
field = data.get("kapsule_iface_mac", None)
945+
if field is not None:
946+
args["kapsule_iface_mac"] = field
947+
948+
field = data.get("full_isolation", None)
949+
if field is not None:
950+
args["full_isolation"] = field
951+
952+
field = data.get("has_gpu", None)
953+
if field is not None:
954+
args["has_gpu"] = field
955+
956+
field = data.get("external_ip", None)
957+
if field is not None:
958+
args["external_ip"] = field
959+
960+
return NodeMetadata(**args)
961+
962+
847963
def marshal_MaintenanceWindow(
848964
request: MaintenanceWindow,
849965
defaults: ProfileDefaults,

0 commit comments

Comments
 (0)