1
1
package main
2
2
3
3
import (
4
- "bytes"
5
- "encoding/json"
6
4
"fmt"
7
5
"reflect"
8
6
"strings"
9
7
10
8
"github.com/spf13/cobra"
11
- yaml "gopkg.in/yaml.v2"
12
9
13
10
"github.com/ovh/cds/cli"
14
11
"github.com/ovh/cds/sdk"
@@ -26,6 +23,7 @@ func workerModel() *cobra.Command {
26
23
cli .NewGetCommand (workerModelShowCmd , workerModelShowRun , nil , withAllCommandModifiers ()... ),
27
24
cli .NewDeleteCommand (workerModelDeleteCmd , workerModelDeleteRun , nil ),
28
25
cli .NewCommand (workerModelImportCmd , workerModelImportRun , nil ),
26
+ cli .NewCommand (workerModelExportCmd , workerModelExportRun , nil , withAllCommandModifiers ()... ),
29
27
})
30
28
}
31
29
@@ -101,24 +99,6 @@ For admin:
101
99
},
102
100
}
103
101
104
1E79
code>
- type workerModelFile struct {
105
- Name string `json:"name" yaml:"name"`
106
- Group string `json:"group" yaml:"group"`
107
- Communication string `json:"communication,omitempty" yaml:"communication,omitempty"`
108
- Provision int `json:"provision,omitempty" yaml:"provision,omitempty"`
109
- Image string `json:"image" yaml:"image"`
110
- Description string `json:"description" yaml:"description"`
111
- Type string `json:"type" yaml:"type"`
112
- Flavor string `json:"flavor,omitempty" yaml:"flavor,omitempty"`
113
- Envs map [string ]string `json:"envs,omitempty" yaml:"envs,omitempty"`
114
- PatternName string `json:"pattern_name,omitempty" yaml:"pattern_name,omitempty"`
115
- Shell string `json:"shell,omitempty" yaml:"shell,omitempty"`
116
- PreCmd string `json:"pre_cmd,omitempty" yaml:"pre_cmd,omitempty"`
117
- Cmd string `json:"cmd,omitempty" yaml:"cmd,omitempty"`
118
- PostCmd string `json:"post_cmd,omitempty" yaml:"post_cmd,omitempty"`
119
- Restricted bool `json:"restricted" yaml:"restricted"`
120
- }
121
-
122
102
func workerModelImportRun (c cli.Values ) error {
123
103
force := c .GetBool ("force" )
124
104
if c .GetString ("filepath" ) == "" {
@@ -132,126 +112,12 @@ func workerModelImportRun(c cli.Values) error {
132
112
return fmt .Errorf ("Error: Cannot read file %s (%v)" , filepath , err )
133
113
}
134
114
135
- buf := new (bytes.Buffer )
136
- if _ , errR := buf .ReadFrom (reader ); errR != nil {
137
- reader .Close ()
138
- return fmt .Errorf ("Error: cannot read file content %s : %v" , filepath , errR )
139
- }
140
- reader .Close ()
141
-
142
- var modelInfos workerModelFile
143
- switch format {
144
- case exportentities .FormatJSON :
145
- if err := json .Unmarshal (buf .Bytes (), & modelInfos ); err != nil {
146
- return fmt .Errorf ("Error: cannot unmarshal json file %s : %v" , filepath , err )
147
- }
148
- case exportentities .FormatYAML :
149
- if err := yaml .Unmarshal (buf .Bytes (), & modelInfos ); err != nil {
150
- return fmt .Errorf ("Error: cannot unmarshal yaml file %s : %v" , filepath , err )
151
- }
152
- default :
153
- return fmt .Errorf ("Invalid file format" )
154
- }
155
-
156
- var t string
157
- var modelDocker sdk.ModelDocker
158
- var modelVM sdk.ModelVirtualMachine
159
- switch modelInfos .Type {
160
- case sdk .Docker :
161
- t = sdk .Docker
162
- if modelInfos .Image == "" {
163
- sdk .Exit ("Error: Docker image not provided\n " )
164
- }
165
- modelDocker .Shell = modelInfos .Shell
166
- modelDocker .Image = modelInfos .Image
167
- modelDocker .Cmd = modelInfos .Cmd
168
- if modelInfos .PatternName == "" {
169
- if modelDocker .Shell == "" {
170
- sdk .Exit ("Error: main shell command not provided\n " )
171
- }
172
- if modelDocker .Cmd == "" {
173
- sdk .Exit ("Error: main worker command not provided\n " )
174
- }
175
- }
176
-
177
- break
178
- case sdk .Openstack :
179
- t = sdk .Openstack
180
- d := sdk.ModelVirtualMachine {
181
- Image : modelInfos .Image ,
182
- Flavor : modelInfos .Flavor ,
183
- Cmd : modelInfos .Cmd ,
184
- PostCmd : modelInfos .PostCmd ,
185
- PreCmd : modelInfos .PreCmd ,
186
- }
187
- if d .Image == "" {
188
- return fmt .Errorf ("Error: Openstack image not provided" )
189
- }
190
- if d .Flavor == "" {
191
- return fmt .Errorf ("Error: Openstack flavor not provided" )
192
- }
193
- if modelInfos .PatternName == "" {
194
- if d .Cmd == "" {
195
- return fmt .Errorf ("Error: Openstack command not provided" )
196
- }
197
- }
198
- modelVM = d
199
- break
200
10000
td>
- case sdk .VSphere :
201
- t = sdk .VSphere
202
- d := sdk.ModelVirtualMachine {
203
- Image : modelInfos .Image ,
204
- Flavor : modelInfos .Flavor ,
205
- Cmd : modelInfos .Cmd ,
206
- PostCmd : modelInfos .PostCmd ,
207
- PreCmd : modelInfos .PreCmd ,
208
- }
209
- if d .Image == "" {
210
- return fmt .Errorf ("Error: VSphere image not provided" )
211
- }
212
- if modelInfos .PatternName == "" {
213
- if d .Cmd == "" {
214
- return fmt .Errorf ("Error: VSphere main worker command empty" )
215
- }
216
- }
217
-
218
- modelVM = d
219
- break
220
- default :
221
- return fmt .Errorf ("Unknown worker type: %s" , modelInfos .Type )
222
- }
223
-
224
- if modelInfos .Name == "" {
225
- return fmt .Errorf ("Error: worker model name is not provided" )
226
- }
227
-
228
- if modelInfos .Group == "" {
229
- return fmt .Errorf ("Error: group is not provided" )
230
- }
231
-
232
- g , err := client .GroupGet (modelInfos .Group )
115
+ formatStr , _ := exportentities .GetFormatStr (format )
116
+ wm , err := client .WorkerModelImport (reader , formatStr , force )
233
117
if err != nil {
234
- return fmt .Errorf ("Error : Unable to get group %s : %s" , modelInfos .Group , err )
235
- }
236
-
237
- if force {
238
- if existingWm , err := client .WorkerModel (modelInfos .Name ); err != nil {
239
- if _ , errAdd := client .WorkerModelAdd (modelInfos .Name , t , modelInfos .PatternName , & modelDocker , & modelVM , g .ID ); errAdd != nil {
240
- return fmt .Errorf ("Error: cannot add worker model %s (%s)" , modelInfos .Name , errAdd )
241
- }
242
- fmt .Printf ("Worker model %s added with success" , modelInfos .Name )
243
- } else {
244
- if _ , errU := client .WorkerModelUpdate (existingWm .ID , modelInfos .Name , t , & modelDocker , & modelVM , g .ID ); errU != nil {
245
- return fmt .Errorf ("Error: cannot update worker model %s (%s)" , modelInfos .Name , errU )
246
- }
247
- fmt .Printf ("Worker model %s updated with success" , modelInfos .Name )
248
- }
249
- } else {
250
- if _ , errAdd := client .WorkerModelAdd (modelInfos .Name , t , modelInfos .PatternName , & modelDocker , & modelVM , g .ID ); errAdd != nil {
251
- return fmt .Errorf ("Error: cannot add worker model %s (%s)" , modelInfos .Name , errAdd )
252
- }
253
- fmt .Printf ("Worker model %s added with success" , modelInfos .Name )
118
+ return err
254
119
}
120
+ fmt .Printf ("Worker model %s imported with success\n " , wm .Name )
255
121
}
256
122
257
123
return nil
@@ -291,3 +157,33 @@ func workerModelDeleteRun(v cli.Values) error {
291
157
}
292
158
return nil
293
159
}
160
+
161
+ var workerModelExportCmd = cli.Command {
162
+ Name : "export" ,
163
+ Short : "Export a worker model" ,
164
+ Args : []cli.Arg {
165
+ {Name : "name" },
166
+ },
167
+ Flags : []cli.Flag {
168
+ {
169
+ Kind : reflect .String ,
170
+ Name : "format" ,
171
+ Usage : "Specify export format (json or yaml)" ,
172
+ Default : "yaml" ,
173
+ },
174
+ },
175
+ }
176
+
177
+ func workerModelExportRun (c cli.Values ) error {
178
+ wmName := c .GetString ("name" )
179
+ wm , err := client .WorkerModel (wmName )
180
+ if err != nil {
181
+ return sdk .WrapError (err , "cannot load worker model %s" , wmName )
182
+ }
183
+ btes , err := client .WorkerModelExport (wm .ID , c .GetString ("format" ))
184
+ if err != nil {
185
+ return err
186
+ }
187
+ fmt .Println (string (btes ))
188
+ return nil
189
+ }
0 commit comments