_patches/runtimes_extra.go (78 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 runtimes
import (
"crypto/tls"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"net/url"
"os"
"time"
"github.com/sciabarracom/openwhisk-client-go/whisk"
"github.com/sciabarracom/openwhisk-wskdeploy/utils"
"github.com/sciabarracom/openwhisk-wskdeploy/wskderrors"
"github.com/sciabarracom/openwhisk-wskdeploy/wski18n"
"github.com/sciabarracom/openwhisk-wskdeploy/wskprint"
)
var Version = "openserverless"
func GetRuntimesByUrl(opURL string, pop *OpenWhiskInfo) error {
// configure transport
tlsConfig := &tls.Config{
InsecureSkipVerify: true,
}
var netTransport = &http.Transport{
TLSClientConfig: tlsConfig,
}
var netClient = &http.Client{
Timeout: time.Second * utils.DEFAULT_HTTP_TIMEOUT,
Transport: netTransport,
}
req, _ := http.NewRequest("GET", opURL, nil)
req.Header.Set(HTTP_CONTENT_TYPE_KEY, HTTP_CONTENT_TYPE_VALUE)
whisk.Debug(whisk.DbgInfo, "trying "+req.URL.String())
res, err := netClient.Do(req)
if err != nil {
// TODO() create an error
errString := wski18n.T(wski18n.ID_ERR_RUNTIMES_GET_X_err_X,
map[string]interface{}{"err": err.Error()})
whisk.Debug(whisk.DbgWarn, errString)
if utils.Flags.Strict {
errMessage := wski18n.T(wski18n.ID_ERR_RUNTIME_PARSER_ERROR,
map[string]interface{}{wski18n.KEY_ERR: err.Error()})
err = wskderrors.NewRuntimeParserError(errMessage)
}
return err
} else {
if res != nil {
defer res.Body.Close()
}
b, _ := ioutil.ReadAll(res.Body)
if b != nil && len(b) > 0 {
stdout := wski18n.T(wski18n.ID_MSG_UNMARSHAL_NETWORK_X_url_X,
map[string]interface{}{"url": opURL})
wskprint.PrintOpenWhiskVerbose(utils.Flags.Verbose, stdout)
return json.Unmarshal(b, pop)
}
return fmt.Errorf("cannot get runtimes")
}
}
// We could get the openwhisk info from bluemix through running the command
// `curl -k https://openwhisk.ng.bluemix.net`
// hard coding it here in case of network unavailable or failure.
func ParseOpenWhisk(apiHost string) (op OpenWhiskInfo, err error) {
opURL := apiHost
_, err = url.ParseRequestURI(opURL)
if err != nil {
opURL = HTTPS + opURL
}
// trying to download info
err = GetRuntimesByUrl(opURL+"/api/info", &op)
if err != nil {
err = GetRuntimesByUrl(opURL, &op)
}
if err != nil {
stdout := wski18n.T(wski18n.ID_MSG_UNMARSHAL_LOCAL)
wskprint.PrintOpenWhiskVerbose(utils.Flags.Verbose, stdout)
runtimes := []byte(os.Getenv("OPS_RUNTIMES_JSON"))
err = json.Unmarshal(runtimes, &op)
if err != nil {
fmt.Printf("cannot parse this json: ===\n%s\n===\n", runtimes)
return
}
}
return
}