Skip to content

Commit 3fa36e6

Browse files
authored
feat(instance): add util to update an image (#365)
1 parent aa22929 commit 3fa36e6

File tree

3 files changed

+154
-1
lines changed

3 files changed

+154
-1
lines changed

packages/clients/src/api/instance/v1/api.utils.ts

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { validatePathParam } from '../../../bridge'
12
import {
23
createExponentialBackoffStrategy,
34
tryAtIntervals,
@@ -11,6 +12,8 @@ import {
1112
SNAPSHOT_TRANSIENT_STATUSES,
1213
VOLUME_TRANSIENT_STATUSES,
1314
} from './content.gen'
15+
import { unmarshalSetImageResponse } from './marshalling.gen'
16+
import { marshalSetImageRequestWithID } from './marshalling.utils'
1417
import type {
1518
GetImageRequest,
1619
GetPrivateNICRequest,
@@ -26,13 +29,18 @@ import type {
2629
Volume,
2730
VolumeServerTemplate,
2831
} from './types.gen'
29-
import type { SetSecurityGroupRuleRequest } from './types.private.gen'
32+
import type {
33+
SetImageResponse,
34+
SetSecurityGroupRuleRequest,
35+
} from './types.private.gen'
3036
import type {
3137
AttachVolumeRequest,
3238
AttachVolumeResponse,
3339
CreateServerRequest,
3440
DetachVolumeRequest,
3541
DetachVolumeResponse,
42+
UpdateImageRequest,
43+
UpdateImageResponse,
3644
UpdateSecurityGroupRequest,
3745
UpdateSecurityGroupResponse,
3846
UpdateSecurityGroupRuleRequest,
@@ -467,4 +475,39 @@ export class InstanceV1UtilsAPI extends API {
467475
zone: request.zone,
468476
} as UpdateServerRequest).then(obj => obj as DetachVolumeResponse)
469477
}
478+
479+
/**
480+
* Updates an image.
481+
*
482+
* @param request - The request {@link UpdateImageRequest}
483+
* @returns A Promise of UpdateImageResponse
484+
*/
485+
updateImage = (
486+
request: Readonly<UpdateImageRequest>,
487+
): Promise<UpdateImageResponse> =>
488+
this.getImage({ zone: request.zone, imageId: request.imageId })
489+
.then(res => validateNotUndefined(res.image))
490+
.then(image => ({
491+
...image,
492+
name: request.name ?? image.name,
493+
tags: request.tags ?? image.tags,
494+
id: image.id,
495+
}))
496+
.then(imageReq =>
497+
this.client.fetch<SetImageResponse>(
498+
{
499+
body: JSON.stringify(
500+
marshalSetImageRequestWithID(imageReq, this.client.settings),
501+
),
502+
headers: { 'Content-Type': 'application/json; charset=utf-8' },
503+
method: 'PUT',
504+
path: `/instance/v1/zones/${validatePathParam(
505+
'zone',
506+
imageReq.zone ?? this.client.settings.defaultZone,
507+
)}/images/${validatePathParam('id', imageReq.id)}`,
508+
},
509+
unmarshalSetImageResponse,
510+
),
511+
)
512+
.then(res => ({ image: res.image }))
470513
}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
import { type DefaultValues } from '../../../bridge'
2+
import type {
3+
Bootscript,
4+
ServerSummary,
5+
Volume,
6+
VolumeSummary,
7+
} from './types.gen'
8+
import type { SetImageRequest } from './types.private.gen'
9+
10+
const marshalVolumeSummary = (
11+
request: VolumeSummary,
12+
defaults: DefaultValues,
13+
): Record<string, unknown> => ({
14+
id: request.id,
15+
name: request.name,
16+
size: request.size,
17+
volume_type: request.volumeType,
18+
})
19+
20+
const marshalServerSummary = (
21+
request: ServerSummary,
22+
defaults: DefaultValues,
23+
): Record<string, unknown> => ({
24+
id: request.id,
25+
name: request.name,
26+
})
27+
28+
const marshalBootscript = (
29+
request: Bootscript,
30+
defaults: DefaultValues,
31+
): Record<string, unknown> => ({
32+
arch: request.arch,
33+
bootcmdargs: request.bootcmdargs,
34+
default: request.default,
35+
dtb: request.dtb,
36+
id: request.id,
37+
initrd: request.initrd,
38+
kernel: request.kernel,
39+
organization: request.organization,
40+
project: request.project,
41+
public: request.public,
42+
title: request.title,
43+
zone: request.zone,
44+
})
45+
46+
const marshalVolume = (
47+
request: Volume,
48+
defaults: DefaultValues,
49+
): Record<string, unknown> => ({
50+
creation_date: request.creationDate,
51+
export_uri: request.exportUri,
52+
id: request.id,
53+
modification_date: request.modificationDate,
54+
name: request.name,
55+
organization: request.organization,
56+
project: request.project,
57+
server: request.server
58+
? marshalServerSummary(request.server, defaults)
59+
: undefined,
60+
size: request.size,
61+
state: request.state,
62+
tags: request.tags,
63+
volume_type: request.volumeType,
64+
zone: request.zone,
65+
})
66+
67+
export const marshalSetImageRequestWithID = (
68+
request: SetImageRequest,
69+
defaults: DefaultValues,
70+
): Record<string, unknown> => ({
71+
arch: request.arch,
72+
creation_date: request.creationDate,
73+
default_bootscript: request.defaultBootscript
74+
? marshalBootscript(request.defaultBootscript, defaults)
75+
: undefined,
76+
extra_volumes: request.extraVolumes
77+
? Object.entries(request.extraVolumes).reduce(
78+
(acc, [key, value]) => ({
79+
...acc,
80+
[key]: marshalVolume(value, defaults),
81+
}),
82+
{},
83+
)
84+
: undefined,
85+
from_server: request.fromServer,
86+
modification_date: request.modificationDate,
87+
id: request.id,
88+
name: request.name,
89+
organization: request.organization,
90+
project: request.project,
91+
public: request.public,
92+
root_volume: request.rootVolume
93+
? marshalVolumeSummary(request.rootVolume, defaults)
94+
: undefined,
95+
state: request.state,
96+
tags: request.tags,
97+
})

packages/clients/src/api/instance/v1/types.utils.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type { Zone } from '../../../scw/locality'
22
import type {
3+
Image,
34
SecurityGroup,
45
SecurityGroupPolicy,
56
SecurityGroupRule,
@@ -93,6 +94,18 @@ export interface DetachVolumeResponse {
9394
server?: Server
9495
}
9596

97+
export type UpdateImageRequest = {
98+
/** Zone to target. If none is passed will use default zone from the config */
99+
zone?: Zone
100+
imageId: string
101+
name?: string
102+
tags?: string[]
103+
}
104+
105+
export interface UpdateImageResponse {
106+
image?: Image
107+
}
108+
96109
export type {
97110
CreateServerRequest,
98111
UpdateServerRequest,

0 commit comments

Comments
 (0)