Skip to content
This repository was archived by the owner on Feb 8, 2021. It is now read-only.

Commit 9f9f73e

Browse files
committed
add the pod validate before running the pod
1 parent b4a2691 commit 9f9f73e

File tree

3 files changed

+46
-25
lines changed

3 files changed

+46
-25
lines changed

client/run.go

+6-8
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ func (cli *HyperClient) HyperCmdRun(args ...string) error {
6262
return err
6363
}
6464
}
65+
6566
t1 := time.Now()
6667
podId, err := cli.RunPod(string(jsonbody))
6768
if err != nil {
@@ -75,7 +76,7 @@ func (cli *HyperClient) HyperCmdRun(args ...string) error {
7576
if opts.K8s != "" {
7677
var (
7778
kpod pod.KPod
78-
pod *pod.UserPod
79+
userpod *pod.UserPod
7980
)
8081
if _, err := os.Stat(opts.K8s); err != nil {
8182
return err
@@ -94,14 +95,15 @@ func (cli *HyperClient) HyperCmdRun(args ...string) error {
9495
if err := json.Unmarshal(jsonbody, &kpod); err != nil {
9596
return err
9697
}
97-
pod, err = kpod.Convert()
98+
userpod, err = kpod.Convert()
9899
if err != nil {
99100
return err
100101
}
101-
jsonbody, err = json.Marshal(*pod)
102+
jsonbody, err = json.Marshal(*userpod)
102103
if err != nil {
103104
return err
104105
}
106+
105107
t1 := time.Now()
106108
podId, err := cli.RunPod(string(jsonbody))
107109
if err != nil {
@@ -172,11 +174,7 @@ func (cli *HyperClient) HyperCmdRun(args ...string) error {
172174
Volumes: []pod.UserVolume{},
173175
Tty: opts.Tty,
174176
}
175-
/*
176-
if err := userPod.Validate(); err != nil {
177-
return err
178-
}
179-
*/
177+
180178
jsonString, _ := json.Marshal(userPod)
181179
podId, err := cli.RunPod(string(jsonString))
182180
if err != nil {

daemon/pod.go

+3
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,9 @@ func (daemon *Daemon) CreatePod(podArgs, podId string, wg *sync.WaitGroup) error
183183
glog.V(1).Infof("Process POD file error: %s", err.Error())
184184
return err
185185
}
186+
if err := userPod.Validate(); err != nil {
187+
return err
188+
}
186189
// store the UserPod into the db
187190
if err := daemon.WritePodToDB(podId, []byte(podArgs)); err != nil {
188191
glog.V(1).Info("Found an error while saveing the POD file")

pod/pod.go

+37-17
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"fmt"
88
"io/ioutil"
99
"os"
10+
"reflect"
1011
)
1112

1213
// Pod Data Structure
@@ -160,12 +161,16 @@ func RandStr(strSize int, randType string) string {
160161
func (pod *UserPod) Validate() error {
161162
uniq, vset := keySet(pod.Volumes)
162163
if !uniq {
163-
return errors.New("Volumes name does not unique")
164+
if len(vset) > 0 {
165+
return errors.New("Volumes name does not unique")
166+
}
164167
}
165168

166169
uniq, fset := keySet(pod.Files)
167170
if !uniq {
168-
return errors.New("Files name does not unique")
171+
if len(fset) > 0 {
172+
return errors.New("Files name does not unique")
173+
}
169174
}
170175

171176
for idx, container := range pod.Containers {
@@ -186,7 +191,7 @@ func (pod *UserPod) Validate() error {
186191

187192
for _, v := range container.Volumes {
188193
if _, ok := vset[v.Volume]; !ok {
189-
return fmt.Errorf("in container %d, volume %s does not exist in file list.", idx, v.Volume)
194+
return fmt.Errorf("in container %d, volume %s does not exist in volume list.", idx, v.Volume)
190195
}
191196
}
192197
}
@@ -199,28 +204,43 @@ type item interface {
199204
}
200205

201206
func keySet(ilist interface{}) (bool, map[string]bool) {
207+
tmp, err := InterfaceSlice(ilist)
208+
if err != nil {
209+
return false, nil
210+
}
202211
iset := make(map[string]bool)
203-
switch ilist.(type) {
204-
case []interface{}:
205-
for _, x := range ilist.([]interface{}) {
206-
switch x.(type) {
207-
case item:
208-
kx := x.(item).key()
209-
if _, ok := iset[kx]; ok {
210-
return false, iset
211-
}
212-
iset[kx] = true
213-
default:
212+
for _, x := range tmp {
213+
switch x.(type) {
214+
case item:
215+
kx := x.(item).key()
216+
if _, ok := iset[kx]; ok {
214217
return false, iset
215218
}
219+
iset[kx] = true
220+
break
221+
default:
222+
return false, iset
216223
}
217-
return true, iset
218-
default:
219-
return false, iset
220224
}
225+
return true, iset
221226
}
222227

223228
func (vol UserVolume) key() string { return vol.Name }
224229
func (vol UserVolumeReference) key() string { return vol.Volume }
225230
func (f UserFile) key() string { return f.Name }
226231
func (env UserEnvironmentVar) key() string { return env.Env }
232+
233+
func InterfaceSlice(slice interface{}) ([]interface{}, error) {
234+
s := reflect.ValueOf(slice)
235+
if s.Kind() != reflect.Slice {
236+
return nil, fmt.Errorf("InterfaceSlice() given a non-slice type")
237+
}
238+
239+
ret := make([]interface{}, s.Len())
240+
241+
for i := 0; i < s.Len(); i++ {
242+
ret[i] = s.Index(i).Interface()
243+
}
244+
245+
return ret, nil
246+
}

0 commit comments

Comments
 (0)