ops_archive.go raw
1 // Copyright 2022-2025 The sacloud/iaas-api-go Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 package fake
16
17 import (
18 "context"
19 "fmt"
20
21 "github.com/sacloud/iaas-api-go"
22 "github.com/sacloud/iaas-api-go/types"
23 )
24
25 // Find is fake implementation
26 func (o *ArchiveOp) Find(ctx context.Context, zone string, conditions *iaas.FindCondition) (*iaas.ArchiveFindResult, error) {
27 results, _ := find(o.key, zone, conditions)
28 var values []*iaas.Archive
29 for _, res := range results {
30 dest := &iaas.Archive{}
31 copySameNameField(res, dest)
32 values = append(values, dest)
33 }
34 return &iaas.ArchiveFindResult{
35 Total: len(results),
36 Count: len(results),
37 From: 0,
38 Archives: values,
39 }, nil
40 }
41
42 // Create is fake implementation
43 func (o *ArchiveOp) Create(ctx context.Context, zone string, param *iaas.ArchiveCreateRequest) (*iaas.Archive, error) {
44 result := &iaas.Archive{}
45
46 copySameNameField(param, result)
47 fill(result, fillID, fillCreatedAt, fillScope)
48
49 if !param.SourceArchiveID.IsEmpty() {
50 source, err := o.Read(ctx, zone, param.SourceArchiveID)
51 if err != nil {
52 return nil, newErrorBadRequest(o.key, types.ID(0), "SourceArchive is not found")
53 }
54 result.SourceArchiveAvailability = source.Availability
55 }
56 if !param.SourceDiskID.IsEmpty() {
57 diskOp := NewDiskOp()
58 source, err := diskOp.Read(ctx, zone, param.SourceDiskID)
59 if err != nil {
60 return nil, newErrorBadRequest(o.key, types.ID(0), "SourceDisk is not found")
61 }
62 result.SourceDiskAvailability = source.Availability
63 }
64
65 result.DisplayOrder = int64(random(100))
66 result.Availability = types.Availabilities.Migrating
67 result.DiskPlanID = types.DiskPlans.HDD
68 result.DiskPlanName = "標準プラン"
69 result.DiskPlanStorageClass = "iscsi9999"
70
71 putArchive(zone, result)
72
73 id := result.ID
74 startDiskCopy(o.key, zone, func() (interface{}, error) {
75 return o.Read(context.Background(), zone, id)
76 })
77
78 return result, nil
79 }
80
81 // CreateBlank is fake implementation
82 func (o *ArchiveOp) CreateBlank(ctx context.Context, zone string, param *iaas.ArchiveCreateBlankRequest) (*iaas.Archive, *iaas.FTPServer, error) {
83 result := &iaas.Archive{}
84 copySameNameField(param, result)
85 fill(result, fillID, fillCreatedAt, fillScope)
86
87 result.Availability = types.Availabilities.Uploading
88
89 putArchive(zone, result)
90
91 return result, &iaas.FTPServer{
92 HostName: fmt.Sprintf("sac-%s-ftp.example.jp", zone),
93 IPAddress: "192.0.2.1",
94 User: fmt.Sprintf("archive%d", result.ID),
95 Password: "password-is-not-a-password",
96 }, nil
97 }
98
99 // Read is fake implementation
100 func (o *ArchiveOp) Read(ctx context.Context, zone string, id types.ID) (*iaas.Archive, error) {
101 value := getArchiveByID(zone, id)
102 if value == nil {
103 return nil, newErrorNotFound(o.key, id)
104 }
105 dest := &iaas.Archive{}
106 copySameNameField(value, dest)
107 return dest, nil
108 }
109
110 // Update is fake implementation
111 func (o *ArchiveOp) Update(ctx context.Context, zone string, id types.ID, param *iaas.ArchiveUpdateRequest) (*iaas.Archive, error) {
112 value, err := o.Read(ctx, zone, id)
113 if err != nil {
114 return nil, err
115 }
116 copySameNameField(param, value)
117 fill(value, fillModifiedAt)
118 return value, nil
119 }
120
121 // Delete is fake implementation
122 func (o *ArchiveOp) Delete(ctx context.Context, zone string, id types.ID) error {
123 _, err := o.Read(ctx, zone, id)
124 if err != nil {
125 return err
126 }
127 ds().Delete(o.key, zone, id)
128 return nil
129 }
130
131 // OpenFTP is fake implementation
132 func (o *ArchiveOp) OpenFTP(ctx context.Context, zone string, id types.ID, openOption *iaas.OpenFTPRequest) (*iaas.FTPServer, error) {
133 value, err := o.Read(ctx, zone, id)
134 if err != nil {
135 return nil, err
136 }
137
138 value.SetAvailability(types.Availabilities.Uploading)
139 putArchive(zone, value)
140
141 return &iaas.FTPServer{
142 HostName: fmt.Sprintf("sac-%s-ftp.example.jp", zone),
143 IPAddress: "192.0.2.1",
144 User: fmt.Sprintf("archive%d", id),
145 Password: "password-is-not-a-password",
146 }, nil
147 }
148
149 // CloseFTP is fake implementation
150 func (o *ArchiveOp) CloseFTP(ctx context.Context, zone string, id types.ID) error {
151 value, err := o.Read(ctx, zone, id)
152 if err != nil {
153 return err
154 }
155
156 if !value.Availability.IsUploading() {
157 value.SetAvailability(types.Availabilities.Available)
158 }
159 putArchive(zone, value)
160 return nil
161 }
162
163 // Share is fake implementation
164 func (o *ArchiveOp) Share(ctx context.Context, zone string, id types.ID) (*iaas.ArchiveShareInfo, error) {
165 value, err := o.Read(ctx, zone, id)
166 if err != nil {
167 return nil, err
168 }
169
170 value.SetAvailability(types.Availabilities.Uploading)
171 putArchive(zone, value)
172
173 return &iaas.ArchiveShareInfo{
174 SharedKey: types.ArchiveShareKey(fmt.Sprintf("%s:%s:%s", zone, id.String(), "xxx")),
175 }, nil
176 }
177
178 // CreateFromShared is fake implementation
179 func (o *ArchiveOp) CreateFromShared(ctx context.Context, zone string, sourceArchiveID types.ID, zoneID types.ID, param *iaas.ArchiveCreateRequestFromShared) (*iaas.Archive, error) {
180 result := &iaas.Archive{}
181
182 var destZone string
183 for name, id := range zoneIDs {
184 if id == zoneID {
185 destZone = name
186 break
187 }
188 }
189
190 copySameNameField(param, result)
191 fill(result, fillID, fillCreatedAt, fillScope)
192
193 result.DisplayOrder = int64(random(100))
194 result.Availability = types.Availabilities.Transferring
195 result.DiskPlanID = types.DiskPlans.HDD
196 result.DiskPlanName = "標準プラン"
197 result.DiskPlanStorageClass = "iscsi9999"
198
199 putArchive(destZone, result)
200
201 id := result.ID
202 startDiskCopy(o.key, destZone, func() (interface{}, error) {
203 return o.Read(context.Background(), destZone, id)
204 })
205
206 return result, nil
207 }
208
209 // Transfer is fake implementation
210 func (o *ArchiveOp) Transfer(ctx context.Context, zone string, sourceArchiveID types.ID, destZoneID types.ID, param *iaas.ArchiveTransferRequest) (*iaas.Archive, error) {
211 result := &iaas.Archive{}
212
213 var destZone string
214 for name, id := range zoneIDs {
215 if id == destZoneID {
216 destZone = name
217 break
218 }
219 }
220
221 copySameNameField(param, result)
222 fill(result, fillID, fillCreatedAt, fillScope)
223
224 result.DisplayOrder = int64(random(100))
225 result.Availability = types.Availabilities.Transferring
226 result.DiskPlanID = types.DiskPlans.HDD
227 result.DiskPlanName = "標準プラン"
228 result.DiskPlanStorageClass = "iscsi9999"
229
230 putArchive(destZone, result)
231
232 id := result.ID
233 startDiskCopy(o.key, destZone, func() (interface{}, error) {
234 return o.Read(context.Background(), destZone, id)
235 })
236
237 return result, nil
238 }
239