-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathparse.go
272 lines (221 loc) · 7.02 KB
/
parse.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
-- +goose Up
-- -----------------------------------------------------
-- Table Namespace
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS Namespace (
id SERIAL PRIMARY KEY,
name VARCHAR(128) NULL);
-- -----------------------------------------------------
-- Table Layer
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS Layer (
id SERIAL PRIMARY KEY,
name VARCHAR(128) NOT NULL UNIQUE,
engineversion SMALLINT NOT NULL,
parent_id INT NULL REFERENCES Layer,
namespace_id INT NULL REFERENCES Namespace);
CREATE INDEX ON Layer (parent_id);
CREATE INDEX ON Layer (namespace_id);
-- -----------------------------------------------------
-- Table Feature
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS Feature (
id SERIAL PRIMARY KEY,
namespace_id INT NOT NULL REFERENCES Namespace,
name VARCHAR(128) NOT NULL,
UNIQUE (namespace_id, name));
-- -----------------------------------------------------
-- Table FeatureVersion
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS FeatureVersion (
id SERIAL PRIMARY KEY,
feature_id INT NOT NULL REFERENCES Feature,
version VARCHAR(128) NOT NULL);
CREATE INDEX ON FeatureVersion (feature_id);
-- -----------------------------------------------------
-- Table Layer_diff_FeatureVersion
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS Layer_diff_FeatureVersion (
layer_id INT NOT NULL REFERENCES Layer ON DELETE CASCADE,
featureversion_id INT NOT NULL REFERENCES FeatureVersion,
modification VARCHAR(32) NOT NULL,
PRIMARY KEY (layer_id, featureversion_id));
CREATE INDEX ON Layer_diff_FeatureVersion (layer_id);
CREATE INDEX ON Layer_diff_FeatureVersion (featureversion_id);
CREATE INDEX ON Layer_diff_FeatureVersion (featureversion_id, layer_id);
-- -----------------------------------------------------
-- Table Vulnerability
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS Vulnerability (
id SERIAL PRIMARY KEY,
namespace_id INT NOT NULL REFERENCES Namespace,
name VARCHAR(128) NOT NULL,
description TEXT NULL,
link VARCHAR(128) NULL,
severity VARCHAR(32) NULL,
UNIQUE (namespace_id, name));
-- -----------------------------------------------------
-- Table Vulnerability_FixedIn_Feature
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS Vulnerability_FixedIn_Feature (
vulnerability_id INT NOT NULL REFERENCES Vulnerability ON DELETE CASCADE,
feature_id INT NOT NULL REFERENCES Feature,
version VARCHAR(128) NOT NULL,
PRIMARY KEY (vulnerability_id, feature_id));
CREATE INDEX ON Vulnerability_FixedIn_Feature (feature_id, vulnerability_id);
-- -----------------------------------------------------
-- Table Vulnerability_Affects_FeatureVersion
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS Vulnerability_Affects_FeatureVersion (
vulnerability_id INT NOT NULL REFERENCES Vulnerability ON DELETE CASCADE,
featureversion_id INT NOT NULL REFERENCES FeatureVersion,
PRIMARY KEY (vulnerability_id, featureversion_id));
CREATE INDEX ON Vulnerability_Affects_FeatureVersion (featureversion_id, vulnerability_id);
-- -----------------------------------------------------
-- Table KeyValue
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS KeyValue (
id SERIAL PRIMARY KEY,
key VARCHAR(128) NOT NULL UNIQUE,
value TEXT);
-- +goose Down
DROP TABLE IF EXISTS Namespace,
Layer,
Feature,
FeatureVersion,
Layer_diff_FeatureVersion,
Vulnerability,
Vulnerability_FixedIn_Feature,
Vulnerability_Affects_FeatureVersion,
KeyValue
CASCADE;
package main
import (
"fmt"
"encoding/json"
"net/http"
"io/ioutil"
)
type Require struct {
Rtype string
Rname string
}
type Resource struct {
Req Require
//TODO: put following to a struct and make a hash?
ID string //returned
Status bool //whether it is available
Msg string //return value from server
}
type TestCase struct {
Name string
License string
Group string
Requires []Require
}
const test_json_str = `{"Name": "Network-performance", "License": "GPL",
"Requires": [{"Rtype": "os", "Rname": "CentOS7.0"}, {"Rtype": "container", "Rname": "DockerV1.0"}
]}`
func parse(ts_str string) (ts_demo TestCase) {
json.Unmarshal([]byte(ts_str), &ts_demo)
return ts_demo
}
func ts_validation(ts_demo TestCase) (validate bool, err_string string){
if len(ts_demo.Name) > 0 {
} else {
err_string = "Cannot find the name"
return false, err_string
}
if len(ts_demo.Requires) > 0 {
} else {
err_string = "Cannot find the Required resource"
return false, err_string
}
return true, "OK"
}
func debug_ts(ts_demo TestCase) {
fmt.Println(ts_demo.Name)
fmt.Println(ts_demo.Group)
fmt.Println(ts_demo.Requires)
}
func apply_os(req Require) (resource Resource){
var default_url string
//run this first to test
// curl -i -H 'Content-Type: application/json' -d '{"Distribution":"Ubuntu14.04","Arch":"arm64", "id": "1235"}' http://127.0.0.1:8080/os
default_url = "http://localhost:8080/os/Ubuntu14.04"
resp, err := http.Get(default_url)
defer resp.Body.Close()
if err != nil {
// handle error
fmt.Println("err in get")
resource.ID = ""
resource.Msg = "err in get os"
resource.Status = false
} else {
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
resource.ID = ""
resource.Msg = "err in read os"
resource.Status = false
} else {
// fmt.Println(string(body))
json.Unmarshal([]byte(body), &resource)
resource.Msg = "ok"
resource.Status = tru
fmt.Println(resource)
}
}
return resource
}
func apply_container(req Require) (resource Resource){
return resource
}
func apply_resource(req Require) (resource Resource){
if req.Rtype == "os" {
resource = apply_os(req)
} else if req.Rtype == "container" {
resource = apply_container(req)
} else {
fmt.Println("What is the new type? How can it pass the validation test")
}
return resource
}
func apply_resources(ts_demo TestCase) (resources []Resource){
for index :=0; index < len(ts_demo.Requires); index++ {
var resource Resource
var req Require
req = ts_demo.Requires[index]
resource = apply_resource(req)
if len(resource.ID) > 1 {
resources = append(resources, resource)
}
}
return resources
}
func ar_validation(ar_demo []Resource) (validate bool, err_string string){
return true, "OK"
}
func debug_ar(ar_demo []Resource) {
fmt.Println(ar_demo)
}
func main() {
var ts_demo TestCase
var validate bool
var msg string
ts_demo = parse(test_json_str)
validate, msg = ts_validation(ts_demo)
if !validate {
fmt.Println(msg)
return
}
debug_ts(ts_demo)
var resources []Resource
//TODO: async in the future
resources = apply_resources(ts_demo)
validate, msg = ar_validation(resources)
if !validate {
fmt.Println(msg)
return
}
debug_ar(resources)
}