@@ -82,6 +82,40 @@ protected ComputeApi(IServiceType serviceType, IAuthenticationProvider authentic
8282 return Endpoint . PrepareGetResourceRequest ( $ "servers/{ serverId } ", cancellationToken ) ;
8383 }
8484
85+ /// <summary />
86+ public virtual async Task < T > GetServerMetadataAsync < T > ( string serverId , CancellationToken cancellationToken = default ( CancellationToken ) )
87+ where T : IChildResource
88+ {
89+ return await BuildGetServerMetadataRequest ( serverId , cancellationToken )
90+ . SendAsync ( )
91+ . ReceiveJson < T > ( )
92+ . PropogateOwner ( this )
93+ . SetParent ( serverId ) ;
94+ }
95+
96+ /// <summary />
97+ public virtual Task < PreparedRequest > BuildGetServerMetadataRequest ( string serverId , CancellationToken cancellationToken = default ( CancellationToken ) )
98+ {
99+ return Endpoint . PrepareGetResourceRequest ( $ "servers/{ serverId } /metadata", cancellationToken ) ;
100+ }
101+
102+ /// <summary />
103+ public virtual async Task < string > GetServerMetadataItemAsync ( string serverId , string key , CancellationToken cancellationToken = default ( CancellationToken ) )
104+ {
105+ dynamic result = await BuildGetServerMetadataItemRequest ( serverId , key , cancellationToken )
106+ . SendAsync ( )
107+ . ReceiveJson ( ) ;
108+
109+ var meta = ( IDictionary < string , object > ) result . meta ;
110+ return meta [ key ] ? . ToString ( ) ;
111+ }
112+
113+ /// <summary />
114+ public virtual Task < PreparedRequest > BuildGetServerMetadataItemRequest ( string serverId , string key , CancellationToken cancellationToken = default ( CancellationToken ) )
115+ {
116+ return Endpoint . PrepareGetResourceRequest ( $ "servers/{ serverId } /metadata/{ key } ", cancellationToken ) ;
117+ }
118+
85119 /// <summary />
86120 public virtual Task < PreparedRequest > BuildCreateServerRequest ( object server , CancellationToken cancellationToken = default ( CancellationToken ) )
87121 {
@@ -98,6 +132,27 @@ protected ComputeApi(IServiceType serviceType, IAuthenticationProvider authentic
98132 . PropogateOwner ( this ) ;
99133 }
100134
135+ /// <summary />
136+ public virtual Task CreateServerMetadataAsync ( string serverId , string key , string value , CancellationToken cancellationToken = default ( CancellationToken ) )
137+ {
138+ return BuildCreateServerMetadataRequest ( serverId , key , value , cancellationToken ) . SendAsync ( ) ;
139+ }
140+
141+ /// <summary />
142+ public virtual async Task < PreparedRequest > BuildCreateServerMetadataRequest ( string serverId , string key , string value , CancellationToken cancellationToken = default ( CancellationToken ) )
143+ {
144+ var serverMetadata = new
145+ {
146+ meta = new Dictionary < string , string >
147+ {
148+ [ key ] = value
149+ }
150+ } ;
151+
152+ PreparedRequest request = await Endpoint . PrepareRequest ( $ "servers/{ serverId } /metadata/{ key } ", cancellationToken ) ;
153+ return request . PreparePutJson ( serverMetadata , cancellationToken ) ;
154+ }
155+
101156 /// <summary>
102157 /// Waits for the server to reach the specified status.
103158 /// </summary>
@@ -213,6 +268,27 @@ protected ComputeApi(IServiceType serviceType, IAuthenticationProvider authentic
213268 . PropogateOwner ( this ) ;
214269 }
215270
271+ /// <summary /> // this keeps existing, but omitted values
272+ public virtual async Task < T > UpdateServerMetadataAsync < T > ( string serverId , object metadata , bool overwrite = false , CancellationToken cancellationToken = default ( CancellationToken ) )
273+ where T : IServiceResource
274+ {
275+ return await BuildUpdateServerMetadataRequest ( serverId , metadata , overwrite , cancellationToken )
276+ . SendAsync ( )
277+ . ReceiveJson < T > ( )
278+ . PropogateOwner ( this ) ;
279+ }
280+
281+ /// <summary />
282+ public virtual async Task < PreparedRequest > BuildUpdateServerMetadataRequest ( string serverId , object metadata , bool overwrite = false , CancellationToken cancellationToken = default ( CancellationToken ) )
283+ {
284+ PreparedRequest request = await Endpoint . PrepareRequest ( $ "servers/{ serverId } /metadata", cancellationToken ) ;
285+
286+ if ( overwrite )
287+ return request . PreparePutJson ( metadata , cancellationToken ) ;
288+
289+ return request . PreparePostJson ( metadata , cancellationToken ) ;
290+ }
291+
216292 /// <summary />
217293 public virtual Task DeleteServerAsync ( string serverId , CancellationToken cancellationToken = default ( CancellationToken ) )
218294 {
@@ -225,6 +301,24 @@ protected ComputeApi(IServiceType serviceType, IAuthenticationProvider authentic
225301 return Endpoint . PrepareDeleteResourceRequest ( $ "servers/{ serverId } ", cancellationToken ) ;
226302 }
227303
304+ /// <summary />
305+ public virtual Task DeleteServerMetadataAsync ( string serverId , string key , CancellationToken cancellationToken = default ( CancellationToken ) )
306+ {
307+ return BuildDeleteServerMetadataRequest ( serverId , key , cancellationToken ) . SendAsync ( ) ;
308+ }
309+
310+ /// <summary />
311+ public virtual Task < PreparedRequest > BuildDeleteServerMetadataRequest ( string serverId , string key , CancellationToken cancellationToken = default ( CancellationToken ) )
312+ {
313+ if ( serverId == null )
314+ throw new ArgumentNullException ( "serverId" ) ;
315+
316+ if ( key == null )
317+ throw new ArgumentNullException ( "key" ) ;
318+
319+ return Endpoint . PrepareDeleteResourceRequest ( $ "servers/{ serverId } /metadata/{ key } ", cancellationToken ) ;
320+ }
321+
228322 /// <summary>
229323 /// Waits for an image to reach the specified state.
230324 /// </summary>
@@ -555,13 +649,13 @@ protected ComputeApi(IServiceType serviceType, IAuthenticationProvider authentic
555649 }
556650
557651 /// <summary />
558- public virtual Task CreateImagMetadataAsync ( string imageId , string key , string value , CancellationToken cancellationToken = default ( CancellationToken ) )
652+ public virtual Task CreateImageMetadataAsync ( string imageId , string key , string value , CancellationToken cancellationToken = default ( CancellationToken ) )
559653 {
560- return BuildCreateImagMetadataRequest ( imageId , key , value , cancellationToken ) . SendAsync ( ) ;
654+ return BuildCreateImageMetadataRequest ( imageId , key , value , cancellationToken ) . SendAsync ( ) ;
561655 }
562656
563657 /// <summary />
564- public virtual async Task < PreparedRequest > BuildCreateImagMetadataRequest ( string imageId , string key , string value , CancellationToken cancellationToken = default ( CancellationToken ) )
658+ public virtual async Task < PreparedRequest > BuildCreateImageMetadataRequest ( string imageId , string key , string value , CancellationToken cancellationToken = default ( CancellationToken ) )
565659 {
566660 var imageMetadata = new
567661 {
0 commit comments