cli/api/catalog/catalog.go (292 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package catalog
import (
"encoding/json"
"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) {
url := fmt.Sprintf("/v1/catalog/icon/%s", itemId)
body, err := network.SendGetRequest(url)
return body, err
}
func IconWithVersion(network *net.Network, itemId, version string) ([]byte, error) {
url := fmt.Sprintf("/v1/catalog/icon/%s/%s", itemId, version)
body, err := network.SendGetRequest(url)
return body, err
}
func GetEntityWithVersion(network *net.Network, entityId, version string) (models.CatalogEntitySummary, error) {
url := fmt.Sprintf("/v1/catalog/entities/%s/%s", entityId, version)
var catalogEntity models.CatalogEntitySummary
body, err := network.SendGetRequest(url)
if err != nil {
return catalogEntity, err
}
err = json.Unmarshal(body, &catalogEntity)
return catalogEntity, err
}
func DeleteEntityWithVersion(network *net.Network, entityId, version string) (string, error) {
url := fmt.Sprintf("/v1/catalog/entities/%s/%s", entityId, version)
body, err := network.SendDeleteRequest(url)
if err != nil {
return "", err
}
return string(body), nil
}
func GetEntity(network *net.Network, entityId string) (models.CatalogEntitySummary, error) {
url := fmt.Sprintf("/v1/catalog/entities/%s", entityId)
var catalogEntity models.CatalogEntitySummary
body, err := network.SendGetRequest(url)
if err != nil {
return catalogEntity, err
}
err = json.Unmarshal(body, &catalogEntity)
return catalogEntity, err
}
func DeleteEntity(network *net.Network, entityId string) (string, error) {
url := fmt.Sprintf("/v1/catalog/entities/%s", entityId)
body, err := network.SendDeleteRequest(url)
if err != nil {
return "", err
}
return string(body), nil
}
func GetPolicy(network *net.Network, policyId string) (models.CatalogItemSummary, error) {
url := fmt.Sprintf("/v1/catalog/policies/%s", policyId)
var catalogItem models.CatalogItemSummary
body, err := network.SendGetRequest(url)
if err != nil {
return catalogItem, err
}
err = json.Unmarshal(body, &catalogItem)
return catalogItem, err
}
func GetPolicyWithVersion(network *net.Network, policyId, version string) (models.CatalogItemSummary, error) {
url := fmt.Sprintf("/v1/catalog/policies/%s/%s", policyId, version)
var catalogItem models.CatalogItemSummary
body, err := network.SendGetRequest(url)
if err != nil {
return catalogItem, err
}
err = json.Unmarshal(body, &catalogItem)
return catalogItem, err
}
func DeletePolicyWithVersion(network *net.Network, policyId, version string) (string, error) {
url := fmt.Sprintf("/v1/catalog/policies/%s/%s", policyId, version)
body, err := network.SendDeleteRequest(url)
if err != nil {
return "", err
}
return string(body), nil
}
func GetApplication(network *net.Network, applicationId string) (models.CatalogEntitySummary, error) {
url := fmt.Sprintf("/v1/catalog/applications/%s", applicationId)
var catalogEntity models.CatalogEntitySummary
body, err := network.SendGetRequest(url)
if err != nil {
return catalogEntity, err
}
err = json.Unmarshal(body, &catalogEntity)
return catalogEntity, err
}
func GetApplicationWithVersion(network *net.Network, applicationId, version string) (models.CatalogEntitySummary, error) {
url := fmt.Sprintf("/v1/catalog/applications/%s/%s", applicationId, version)
var catalogEntity models.CatalogEntitySummary
body, err := network.SendGetRequest(url)
if err != nil {
return catalogEntity, err
}
err = json.Unmarshal(body, &catalogEntity)
return catalogEntity, err
}
func DeleteApplicationWithVersion(network *net.Network, applicationId, version string) (string, error) {
url := fmt.Sprintf("/v1/catalog/applications/%s/%s", applicationId, version)
body, err := network.SendDeleteRequest(url)
if err != nil {
return "", err
}
return string(body), nil
}
func DeleteLocationWithVersion(network *net.Network, locationId, version string) (string, error) {
url := fmt.Sprintf("/v1/catalog/locations/%s/%s", locationId, version)
body, err := network.SendDeleteRequest(url)
if err != nil {
return "", err
}
return string(body), nil
}
func Policies(network *net.Network) ([]models.CatalogItemSummary, error) {
url := "/v1/catalog/policies?allVersions"
var policies []models.CatalogItemSummary
body, err := network.SendGetRequest(url)
if err != nil {
return policies, err
}
err = json.Unmarshal(body, &policies)
return policies, err
}
func Locations(network *net.Network) ([]models.CatalogItemSummary, error) {
url := "/v1/catalog/locations?allVersions=true"
var catalogLocations []models.CatalogItemSummary
body, err := network.SendGetRequest(url)
if err != nil {
return catalogLocations, err
}
err = json.Unmarshal(body, &catalogLocations)
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
}
relativePath = strings.Replace(relativePath, "\\", "/", -1)
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) (*models.CatalogBundleAddResult, error) {
urlString := "/v1/catalog"
urlStringWithDetail := urlString + "?detail=true"
var result models.CatalogBundleAddResult
var body []byte
//Force auto-detect by default
contentType := "application/octet-stream"
u, err := url.Parse(resource)
if err != nil {
return nil, err
}
//If the resource exists as a file, or if the resource-parsed-as-URL as file scheme
_, err = os.Stat(resource)
if err == nil || "file" == u.Scheme {
if "file" == u.Scheme {
if u.Path == "" {
return nil, errors.New("No resource in 'file:' URL: " + resource)
}
resource = u.Path
}
file, err := os.Open(filepath.Clean(resource))
if err != nil {
return nil, err
}
fileStat, err := file.Stat()
if err != nil {
return nil, err
}
var dat []byte
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
}
dat = buf.Bytes()
contentType = "application/x-zip"
} else {
extension := filepath.Ext(resource)
lowercaseExtension := strings.ToLower(extension)
if lowercaseExtension == ".zip" {
contentType = "application/x-zip"
urlString = urlStringWithDetail
} else if lowercaseExtension == ".jar" {
contentType = "application/x-jar"
urlString = urlStringWithDetail
} else if lowercaseExtension == ".yaml" || lowercaseExtension == ".bom" {
contentType = "application/x-yaml"
}
dat, err = ioutil.ReadFile(resource)
if err != nil {
return nil, err
}
}
body, err = network.SendPostRequestWithContentType(urlStringWithDetail, dat, contentType)
if err != nil {
return nil, err
}
} else if "http" == u.Scheme || "https" == u.Scheme {
body, err = network.SendPostResourceRequest(urlString, resource, contentType)
if err != nil {
return nil, err
}
} else {
return nil, errors.New("File does not exist or unrecognised URL protocol scheme: " + resource)
}
err = json.Unmarshal(body, &result)
if result.Code == "" {
// detail API not supported, just store the types
err = json.Unmarshal(body, &result.Types)
}
return &result, err
}
func GetLocation(network *net.Network, locationId string) (models.CatalogItemSummary, error) {
url := fmt.Sprintf("/v1/catalog/locations/%s", locationId)
var catalogLocation models.CatalogItemSummary
body, err := network.SendGetRequest(url)
if err != nil {
return catalogLocation, err
}
err = json.Unmarshal(body, &catalogLocation)
return catalogLocation, err
}
func GetLocationWithVersion(network *net.Network, locationId, version string) (models.CatalogItemSummary, error) {
url := fmt.Sprintf("/v1/catalog/locations/%s/%s", locationId, version)
var catalogLocation models.CatalogItemSummary
body, err := network.SendGetRequest(url)
if err != nil {
return catalogLocation, err
}
err = json.Unmarshal(body, &catalogLocation)
return catalogLocation, err
}
func PostLocationWithVersion(network *net.Network, locationId, version string) (string, error) {
url := fmt.Sprintf("/v1/catalog/locations/%s/%s", locationId, version)
body, err := network.SendEmptyPostRequest(url)
if err != nil {
return "", err
}
return string(body), nil
}
func Entities(network *net.Network) ([]models.CatalogItemSummary, error) {
url := "/v1/catalog/entities?allVersions=true"
var entities []models.CatalogItemSummary
body, err := network.SendGetRequest(url)
if err != nil {
return entities, err
}
err = json.Unmarshal(body, &entities)
return entities, err
}
func Catalog(network *net.Network) ([]models.CatalogItemSummary, error) {
url := "/v1/catalog/applications?allVersions=true"
var applications []models.CatalogItemSummary
body, err := network.SendGetRequest(url)
if err != nil {
return applications, err
}
err = json.Unmarshal(body, &applications)
return applications, err
}