1+ from dataclasses import dataclass
2+ from typing import Dict , Any , Optional , BinaryIO
3+
4+ from scaleway_core .bridge import Zone
5+ from scaleway_core .profile import ProfileDefaults
6+ from scaleway_core .utils import validate_path_param
7+ from .api import InstanceV1API
8+
9+ @dataclass
10+ class GetServerUserDataRequest :
11+ zone : Optional [Zone ]
12+ """
13+ Zone of the user data to get
14+ """
15+
16+ server_id : str
17+
18+ key : str
19+ """
20+ Key defines the user data key to get
21+ """
22+
23+
24+ def marshal_GetServerUserDataRequest (request : GetServerUserDataRequest , defaults : ProfileDefaults ) -> Dict [str , Any ]:
25+ output : Dict [str , Any ] = {}
26+
27+ if request .server_id is not None :
28+ output ["server_id" ] = request .server_id
29+ if request .key is not None :
30+ output ["key" ] = request .key
31+ if request .zone is not None :
32+ output ["zone" ] = request .zone
33+
34+ return output
35+
36+ @dataclass
37+ class SetServerUserDataRequest :
38+ zone : Optional [Zone ]
39+ """
40+ Zone of the user data to set
41+ """
42+
43+ server_id : str
44+
45+ key : str
46+ """
47+ Key defines the user data key to set
48+ """
49+
50+ content : BinaryIO
51+ """
52+ Content defines the data to set
53+ """
54+
55+ def marshal_SetServerUserDataRequest (request : SetServerUserDataRequest , defaults : ProfileDefaults ) -> Dict [str , Any ]:
56+ output : Dict [str , Any ] = {}
57+
58+ if request .server_id is not None :
59+ output ["server_id" ] = request .server_id
60+ if request .key is not None :
61+ output ["key" ] = request .key
62+ if request .zone is not None :
63+ output ["zone" ] = request .zone
64+ if request .content is not None :
65+ output ["content" ] = request .content
66+
67+ return output
68+
69+
70+ class InstanceUtilsV1API (InstanceV1API ):
71+ """
72+ This API extends InstanceV1API by adding utility methods for managing Instance resources,
73+ such as getting and setting server user data, while inheriting all methods of InstanceV1API.
74+ """
75+
76+ def get_server_user_data (self , server_id : str , key : str , zone : Optional [Zone ] = None ):
77+ """
78+ GetServerUserData gets the content of a user data on a server for the given key.
79+ :param zone: Zone to target. If none is passed will use default zone from the config.
80+ :param server_id:
81+ :param key:
82+ :return: A plain text response with data user information
83+
84+ Usage:
85+ ::
86+
87+ result = api.get_server_user_data(
88+ server_id="example",
89+ key="example",
90+ )
91+ """
92+ param_zone = validate_path_param ("zone" , zone or self .client .default_zone )
93+ param_server_id = validate_path_param ("server_id" , server_id )
94+
95+ res = self ._request (
96+ "GET" ,
97+ f"/instance/v1/zones/{ param_zone } /servers/{ param_server_id } /user_data/{ key } " ,
98+ body = marshal_GetServerUserDataRequest (
99+ GetServerUserDataRequest (
100+ zone = zone ,
101+ server_id = server_id ,
102+ key = key ,
103+ ),
104+ self .client ,
105+ ),
106+ )
107+
108+ self ._throw_on_error (res )
109+ return res .json ()
110+
111+ def set_server_user_data (self , server_id : str , key : str , content : BinaryIO , zone : Optional [Zone ] = None ):
112+ """
113+ Sets the content of a user data on a server for the given key.
114+ :param zone: Zone to target. If none is passed, it will use the default zone from the config.
115+ :param server_id: The ID of the server.
116+ :param key: The user data key.
117+ :param content: The content to set as user data.
118+ :return: A plain text response confirming the operation.
119+ """
120+ param_zone = validate_path_param ("zone" , zone or self .client .default_zone )
121+ param_server_id = validate_path_param ("server_id" , server_id )
122+
123+ res = self ._request (
124+ "PATCH" ,
125+ f"/instance/v1/zones/{ param_zone } /servers/{ param_server_id } /user_data/{ key } " ,
126+ body = marshal_SetServerUserDataRequest (
127+ SetServerUserDataRequest (
128+ zone = zone ,
129+ server_id = server_id ,
130+ key = key ,
131+ content = content ,
132+ ),
133+ self .client ,
134+ ),
135+ )
136+
137+ self ._throw_on_error (res )
138+ return res .json ()
139+
140+
141+
142+ def test_method (self ):
143+ print ("hello" )
144+
145+ InstanceV1API .test_method = test_method
0 commit comments