Skip to content
Snippets Groups Projects
Select Git revision
  • master default protected
  • 94-update-provisioning-api-to-support-new-brocaar-interface
  • 0.7.0
  • 0.6.0
  • 0.5.0
  • 0.4.0
  • 0.3.1
  • 0.3.0
  • 0.2.2
  • 0.2.1
  • 0.2.0
  • 0.1.0
12 results

http.go

http.go 2.58 KiB
package provisioning

import (
	"bytes"
	"crypto/tls"
	"encoding/json"
	"errors"
	"io"
	"lorhammer/src/model"
	"net"
	"net/http"
	"time"

	"github.com/sirupsen/logrus"
)

var logHTTPProvisioner = logrus.WithField("logger", "orchestrator/provisioning/http")

const (
	httpType    = Type("http")
	httpTimeout = 1 * time.Minute
)

type httpProvisoner struct {
	CreationAPIURL    string `json:"creationApiUrl"`
	DeletionAPIURL    string `json:"deletionApiUrl"`
	post              func(url string, contentType string, body io.Reader) (resp *http.Response, err error)
	sensorsRegistered []model.Register
}

func newHTTPProvisioner(rawConfig json.RawMessage) (provisioner, error) {
	client := http.Client{
		Transport: &http.Transport{
			TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
			Dial: (&net.Dialer{
				Timeout: httpTimeout,
			}).Dial,
			TLSHandshakeTimeout: httpTimeout,
		},
		Timeout: httpTimeout,
	}
	config := &httpProvisoner{
		post: client.Post,
	}

	if err := json.Unmarshal(rawConfig, config); err != nil {
		return nil, err
	}
	return config, nil
}

func (httpProvisioner *httpProvisoner) Provision(sensorsToRegister model.Register) error {
	byteData, err := json.Marshal(sensorsToRegister)
	if err != nil {
		return err
	}
	resp, err := httpProvisioner.post(httpProvisioner.CreationAPIURL, "application/json", bytes.NewReader(byteData))
	if err != nil {
		return err
	}
	defer resp.Body.Close()
	if !(resp.StatusCode >= http.StatusOK && resp.StatusCode < http.StatusMultipleChoices) {
		logHTTPProvisioner.WithFields(logrus.Fields{
			"errorCode": resp.StatusCode,
			"errorName": resp.Status,
			"dataPost":  string(byteData),
		}).Error("Wrong return code in HTTP provisioning")
		err = errors.New("Wrong return code")
		return err
	}

	httpProvisioner.sensorsRegistered = append(httpProvisioner.sensorsRegistered, sensorsToRegister)
	return nil
}

func (httpProvisioner *httpProvisoner) DeProvision() error {
	for _, sensorsRegistered := range httpProvisioner.sensorsRegistered {
		byteData, err := json.Marshal(sensorsRegistered)
		if err != nil {
			return err
		}
		resp, err := httpProvisioner.post(httpProvisioner.DeletionAPIURL, "application/json", bytes.NewReader(byteData))
		if err != nil {
			return err
		}
		defer resp.Body.Close()
		if !(resp.StatusCode >= http.StatusOK && resp.StatusCode < http.StatusMultipleChoices) {
			logHTTPProvisioner.WithFields(logrus.Fields{
				"errorCode": resp.StatusCode,
				"errorName": resp.Status,
				"dataPost":  string(byteData),
			}).Error("Wrong return code in HTTP de-provisioning")
			err = errors.New("Wrong return code")
			return err
		}
	}
	return nil
}