Repository: brooklyn-client
Updated Branches:
  refs/heads/master 95d1fb0d7 -> 3486f6ff4


Added the ability to upload a zip via the CLI


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-client/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-client/commit/1cf07d53
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-client/tree/1cf07d53
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-client/diff/1cf07d53

Branch: refs/heads/master
Commit: 1cf07d53241c80e1552b8af224f634ce5c7f8170
Parents: df47be8
Author: graeme.miller <[email protected]>
Authored: Wed Apr 5 16:12:04 2017 +0100
Committer: graeme.miller <[email protected]>
Committed: Fri Apr 7 11:51:13 2017 +0100

----------------------------------------------------------------------
 cli/api/catalog/catalog.go | 101 ++++++++++++++++++++++++++++++++++++++--
 cli/net/net.go             |   8 +++-
 2 files changed, 104 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-client/blob/1cf07d53/cli/api/catalog/catalog.go
----------------------------------------------------------------------
diff --git a/cli/api/catalog/catalog.go b/cli/api/catalog/catalog.go
index 2ff3a88..0928590 100644
--- a/cli/api/catalog/catalog.go
+++ b/cli/api/catalog/catalog.go
@@ -23,6 +23,14 @@ import (
        "fmt"
        "github.com/apache/brooklyn-client/cli/models"
        "github.com/apache/brooklyn-client/cli/net"
+       "net/url"
+        "path/filepath"
+       "errors"
+       "os"
+       "strings"
+       "archive/zip"
+       "io/ioutil"
+       "bytes"
 )
 
 func Icon(network *net.Network, itemId string) ([]byte, error) {
@@ -170,15 +178,102 @@ func Locations(network *net.Network) 
([]models.CatalogItemSummary, error) {
        return catalogLocations, err
 }
 
+
+func ZipResource(resource string) (*bytes.Buffer, error) {
+       buf := new(bytes.Buffer)
+       writer := zip.NewWriter(buf)
+       defer writer.Close()
+
+       walkFn := func(path string, info os.FileInfo, err error) error {
+               if info.IsDir() {
+                       return nil
+               }
+
+               relativePath, err := filepath.Rel(resource, path)
+               if err != nil {
+                       return err
+               }
+               f, err := writer.Create(relativePath)
+               if err != nil {
+                       return err
+               }
+
+               fileBytes, err := ioutil.ReadFile(path)
+               if err != nil {
+                       return err
+               }
+
+               _, err = f.Write(fileBytes)
+               if err != nil {
+                       return err
+               }
+               return nil
+       }
+
+       err := filepath.Walk(resource, walkFn)
+
+       return buf, err;
+}
+
 func AddCatalog(network *net.Network, resource string) 
(map[string]models.CatalogEntitySummary, error) {
-       url := "/v1/catalog"
+       urlString := "/v1/catalog"
        var entities map[string]models.CatalogEntitySummary
-       body, err := network.SendPostResourceRequest(url, resource, 
"application/json")
+
+       //Assume application/json. This is correct for http/file resources.
+       //Zips will need application/x-zip
+       contentType := "application/json"
+       u, err := url.Parse(resource)
+       if err != nil {
+               return nil, err
+       }
+
+       //Only deal with the below file types
+       if "" != u.Scheme && "file" != u.Scheme  && "http" != u.Scheme && 
"https" != u.Scheme{
+               return nil, errors.New("Unrecognised protocol scheme: " + 
u.Scheme)
+       }
+
+       if "" == u.Scheme || "file" == u.Scheme {
+               file, err := os.Open(filepath.Clean(resource))
+               if err != nil {
+                       return nil, err
+               }
+
+               fileStat, err := file.Stat()
+               if err != nil {
+                       return nil, err
+               }
+
+               if fileStat.IsDir() {
+                       //A dir is a special case, we need to zip it up, and 
call a different network method
+                       buf, err := ZipResource(resource)
+                       if err != nil {
+                               return nil, err
+                       }
+                       body, err := 
network.SendPostRequestWithContentType(urlString, buf.Bytes(), 
"application/x-zip")
+                       if err != nil {
+                               return nil, err
+                       }
+                       err = json.Unmarshal(body, &entities)
+                       return entities, err
+               } else {
+                       extension := filepath.Ext(resource)
+                       lowercaseExtension := strings.ToLower(extension)
+                       if lowercaseExtension == ".zip" {
+                               contentType = "application/x-zip"
+                       } else if lowercaseExtension == ".jar" {
+                               contentType = "application/x-jar"
+                       }
+               }
+
+       }
+
+       body, err := network.SendPostResourceRequest(urlString, resource, 
contentType)
        if err != nil {
                return nil, err
        }
        err = json.Unmarshal(body, &entities)
-       return entities, nil
+
+       return entities, err
 }
 
 func Reset(network *net.Network) (string, error) {

http://git-wip-us.apache.org/repos/asf/brooklyn-client/blob/1cf07d53/cli/net/net.go
----------------------------------------------------------------------
diff --git a/cli/net/net.go b/cli/net/net.go
index 73cfdea..b6ffb19 100644
--- a/cli/net/net.go
+++ b/cli/net/net.go
@@ -166,13 +166,17 @@ func (net *Network) SendEmptyPostRequest(url string) 
([]byte, error) {
        return body, err
 }
 
-func (net *Network) SendPostRequest(urlStr string, data []byte) ([]byte, 
error) {
+func (net *Network) SendPostRequestWithContentType(urlStr string, data []byte, 
contentType string) ([]byte, error) {
        req := net.NewPostRequest(urlStr, bytes.NewBuffer(data))
-       req.Header.Set("Content-Type", "application/json")
+       req.Header.Set("Content-Type", contentType)
        body, err := net.SendRequest(req)
        return body, err
 }
 
+func (net *Network) SendPostRequest(urlStr string, data []byte) ([]byte, 
error) {
+       return net.SendPostRequestWithContentType(urlStr, data, 
"application/json")
+}
+
 func (net *Network) SendPostResourceRequest(restUrl string, resourceUrl 
string, contentType string) ([]byte, error) {
        resource, err := net.openResource(resourceUrl)
        if err != nil {

Reply via email to