From 945da4ba492850722a70cebe5c0ec14ed5d15f82 Mon Sep 17 00:00:00 2001 From: Olivier Wulveryck Date: Tue, 5 Jan 2016 21:15:09 +0100 Subject: [PATCH] CsarParser --- parser.go | 104 +++++++++++++++++++ service_template_test.go | 35 +++++-- tests/csar_elk.zip | Bin 0 -> 17488 bytes tests/csar_hello_world.zip | Bin 0 -> 936 bytes tests/csar_metadata_not_yaml.zip | Bin 0 -> 936 bytes tests/csar_not_zip.zip | 1 + tests/csar_single_instance_wordpress.zip | Bin 0 -> 5967 bytes tests/csar_wordpress_invalid_import_path.zip | Bin 0 -> 5971 bytes tests/csar_wordpress_invalid_script_url.zip | Bin 0 -> 6034 bytes tests/csar_wrong_metadata_file.zip | Bin 0 -> 873 bytes 10 files changed, 132 insertions(+), 8 deletions(-) create mode 100644 tests/csar_elk.zip create mode 100644 tests/csar_hello_world.zip create mode 100644 tests/csar_metadata_not_yaml.zip create mode 100644 tests/csar_not_zip.zip create mode 100644 tests/csar_single_instance_wordpress.zip create mode 100644 tests/csar_wordpress_invalid_import_path.zip create mode 100644 tests/csar_wordpress_invalid_script_url.zip create mode 100644 tests/csar_wrong_metadata_file.zip diff --git a/parser.go b/parser.go index 773fa01..55b05be 100644 --- a/parser.go +++ b/parser.go @@ -1,12 +1,17 @@ package toscalib import ( + "archive/zip" + "fmt" + "golang.org/x/tools/godoc/vfs" + "golang.org/x/tools/godoc/vfs/zipfs" "gopkg.in/yaml.v2" "io" "io/ioutil" "log" "net/http" "net/url" + "path/filepath" ) // GetNodeTemplate returns a pointer to a node template given its name @@ -88,6 +93,105 @@ func merge(s, t ServiceTemplateDefinition) ServiceTemplateDefinition { return s } +// Open and parse the Csar file c +func (t *ServiceTemplateDefinition) ParseCsar(zipfile string) error { + + type meta struct { + Version string `yaml:"TOSCA-Meta-File-Version"` + CsarVersion string `yaml:"CSAR-Version"` + CreatedBy string `yaml:"Created-By"` + EntryDefinition string `yaml:"Entry-Definitions"` + } + + rc, err := zip.OpenReader(zipfile) + defer rc.Close() + if err != nil { + log.Fatalf("%s: %s\n", zipfile, err) + + } + fs := zipfs.New(rc, zipfile) + out, err := vfs.ReadFile(fs, "/TOSCA-Metadata/TOSCA.meta") + if err != nil { + log.Fatal(err) + + } + var m meta + err = yaml.Unmarshal(out, &m) + if err != nil { + log.Println("Cannont unmarshal", string(out)) + return err + } + log.Println(m.EntryDefinition) + dirname := fmt.Sprintf("/%v", filepath.Dir(m.EntryDefinition)) + base := filepath.Base(m.EntryDefinition) + ns := vfs.NameSpace{} + ns.Bind("/", fs, dirname, vfs.BindReplace) + // Now read the yaml + rsc, err := ns.Open(base) + if err != nil { + return err + + } + var std ServiceTemplateDefinition + data, err := ioutil.ReadAll(rsc) + if err != nil { + return err + } + + // Unmarshal the data in an interface + err = yaml.Unmarshal(data, &std) + if err != nil { + log.Println("Cannont unmarshal", string(data)) + return err + } + // Import de normative types by default + for _, normType := range []string{"interface_types", "relationship_types", "node_types", "capability_types"} { + data, err := Asset(normType) + if err != nil { + log.Panic("Normative type not found") + return err + } + var tt ServiceTemplateDefinition + err = yaml.Unmarshal(data, &tt) + if err != nil { + log.Println("Cannont unmarshal", string(data)) + return err + } + std = merge(std, tt) + } + for _, im := range std.Imports { + rsc, err := ns.Open(im) + if err != nil { + return err + + } + var tt ServiceTemplateDefinition + data, err := ioutil.ReadAll(rsc) + if err != nil { + return err + } + + // Unmarshal the data in an interface + err = yaml.Unmarshal(data, &tt) + if err != nil { + log.Println("Cannont unmarshal", string(data)) + return err + } + std = merge(std, tt) + } + // Free the imports + std.Imports = []string{} + *t = std + for name, node := range t.TopologyTemplate.NodeTemplates { + node.fillInterface(*t) + node.setRefs(t) + node.setName(name) + t.TopologyTemplate.NodeTemplates[name] = node + } + + return nil +} + // Parse a TOSCA document and fill in the structure func (t *ServiceTemplateDefinition) Parse(r io.Reader) error { var std ServiceTemplateDefinition diff --git a/service_template_test.go b/service_template_test.go index 4703d3f..ac3b06a 100644 --- a/service_template_test.go +++ b/service_template_test.go @@ -4,6 +4,7 @@ import ( "fmt" "io/ioutil" "os" + "path/filepath" "testing" ) @@ -12,15 +13,33 @@ func TestParse(t *testing.T) { for _, f := range files { if !f.IsDir() { fname := fmt.Sprintf("./tests/%v", f.Name()) - var s ServiceTemplateDefinition - o, err := os.Open(fname) - if err != nil { - t.Fatal(err) + if filepath.Ext(fname) == "yaml" { + var s ServiceTemplateDefinition + o, err := os.Open(fname) + if err != nil { + t.Fatal(err) + } + err = s.Parse(o) + if err != nil { + t.Log("Error in processing", fname) + t.Fatal(err) + } } - err = s.Parse(o) - if err != nil { - t.Log("Error in processing", fname) - t.Fatal(err) + } + + } +} +func TestParseCsar(t *testing.T) { + files, _ := ioutil.ReadDir("./tests") + for _, f := range files { + if !f.IsDir() { + fname := fmt.Sprintf("./tests/%v", f.Name()) + if filepath.Ext(fname) == "zip" { + var s ServiceTemplateDefinition + err := s.ParseCsar(fname) + if err != nil { + t.Fatal(err) + } } } diff --git a/tests/csar_elk.zip b/tests/csar_elk.zip new file mode 100644 index 0000000000000000000000000000000000000000..5fae801a7538fea7208bedc504f300bcda30efff GIT binary patch literal 17488 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 R01TjCGf?3F5`+N&{6B74f*Ak+ literal 0 HcmV?d00001 diff --git a/tests/csar_hello_world.zip b/tests/csar_hello_world.zip new file mode 100644 index 0000000000000000000000000000000000000000..43ffbbc83003a5b4fa1e04284d080610c9051877 GIT binary patch literal 936 zcmWIWW@Zs#U|`^2XiJlK*F7Nc&47`Cp_GY%L6kv;p(MXJIWayXH76&(JijO>MXxe3 zHzzcNlYu#B!;{cU$Df3jR&X;gvb=@U(4maJG_BymW7dTLBgyp zZ{=FAG`L=N*|__n?cbPN8^e-!s(j4<|1Zgv$vT_sPOz)f!lciQonJSw?DX)lo0cK< z+S}N4vX1tI*hL!C=ah$B%sTL+~Rhv`U0$Q2YGv+BX>@%DjU(Px~E$RHs?W}X`+2pei#+94hlAU_R?AJ=h z9nHQ8jN)1wy(Y7nT%WTz?N1nw5u0P{n!SY^pQ)Z{d)V}2N%8NXZ7*4_tzP)-;`d86 zR?W|^He|&vPTHHHto>HtzSK3wJBzrLd+Hxt*;sot-uctFhV41GQzu(bS}@s4^YPEb zM6vISTk@VouX^=aV_p9=m)*O5i?5%({H@2nf2&;W&hKLk00uu7F!&i5a!cgh!3-$D z4-Ebg|6pfFUEkD_#FWI6M163;&pq)ZbTbg61w6Zt;D_>8VHErhfNTw?RIZFd3#m|`|F@NH$ z$&=&f#ZQ^MD17FO*@syf0=yZSMXxe3 zHzzcNlYu#B!;{d&ZBIf=E4UdLSza>`cnbIL=mavic$(J+{{aN#Qkv54(LjfN}bYbMDks_pr5(5YWBNyzEk zW*;Y>R0|Wgs?Div0j*5y8S|7G_8HENFK3;gmUMpRcGfxeZ1UL$Jl}Z2I2a`t2s}FTbXIs!$jaA~W=)$pJ(B54z?#JYlj7&hk(fVm z*5t|Y^WvvWUKBoa#_Yqa3<2JZOmfV)5}^b*Jb-DEVM`;3i6cp}LXsq!7a&IC3SfxQ z3=9Gce;wJ|4U?aQt1g4?LL66ILRyL4FnSqcWXh1VCFETIy0GTT` AZvX%Q literal 0 HcmV?d00001 diff --git a/tests/csar_not_zip.zip b/tests/csar_not_zip.zip new file mode 100644 index 0000000..43b7f5f --- /dev/null +++ b/tests/csar_not_zip.zip @@ -0,0 +1 @@ +This is an invalid CSAR file. \ No newline at end of file diff --git a/tests/csar_single_instance_wordpress.zip b/tests/csar_single_instance_wordpress.zip new file mode 100644 index 0000000000000000000000000000000000000000..5df7b48333a2480cd6f686e339cb0656fd0d009a GIT binary patch literal 5967 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 literal 0 HcmV?d00001 diff --git a/tests/csar_wordpress_invalid_import_path.zip b/tests/csar_wordpress_invalid_import_path.zip new file mode 100644 index 0000000000000000000000000000000000000000..d6442594363def4ad1dca76b884680e8c375fa15 GIT binary patch literal 5971 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 PZs2zT_+-FA{O|t&l?c`g literal 0 HcmV?d00001 diff --git a/tests/csar_wordpress_invalid_script_url.zip b/tests/csar_wordpress_invalid_script_url.zip new file mode 100644 index 0000000000000000000000000000000000000000..6014f9230474b680a3d5e5db31287f655bd6cf3c GIT binary patch literal 6034 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 literal 0 HcmV?d00001 diff --git a/tests/csar_wrong_metadata_file.zip b/tests/csar_wrong_metadata_file.zip new file mode 100644 index 0000000000000000000000000000000000000000..85d660a037693b3447038e5bc94732679f3ac8d2 GIT binary patch literal 873 zcmWIWW@Zs#U|`^2XiJlK*F7Nc&47`Cp_GY%L6kv;p(MXJIWayXH76&(JijO>MXxe3 zHzzcNlYu#B!;?@DF0J5ZU}Sm8%)kI9N+%u6J7mDq_P&?6Pt9MccnIw>E|)?^OAi|Nmc-E0c9L*PUQjr-ezM8#}*lVA<*6V>c~B>b1AA z>0}-439*Ybrq3x4xyp6OPDR6D+QNme7{nsB3pE<9l&_g2qo}s$%R#4p#Uvr8bDMpf zcv3A)+^ROGvIVpWU7WNxLs|Q+zBs36+(E=V}5F^l_yG{p{~u_UHJU~~0A=7No6 z1RCdnX{2jjNl~S)OKMtXUS>&VeqOPa0@n1v72wUtB*%;^6-j_S1WZ&6TN*)3tY(CU zutL%lhPOaQ;|d{&(F_a%41XQ#fi_@-7tl~pc;PV=GqjN1djiu?