The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/2720

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===
Here's some random patches that add or abstract bits that we'll need for clustering.
From c9e723f295621645124ff3978c028b782de3f6aa Mon Sep 17 00:00:00 2001
From: Tycho Andersen <[email protected]>
Date: Thu, 1 Dec 2016 09:03:26 -0700
Subject: [PATCH 1/5] client: commonize update methods and add PATCH

Signed-off-by: Tycho Andersen <[email protected]>
---
 client.go | 64 ++++++++++++++-------------------------------------------------
 1 file changed, 14 insertions(+), 50 deletions(-)

diff --git a/client.go b/client.go
index 67ce9c2..a4265aa 100644
--- a/client.go
+++ b/client.go
@@ -403,7 +403,7 @@ func (c *Client) baseGet(getUrl string) (*Response, error) {
        return HoistResponse(resp, Sync)
 }
 
-func (c *Client) put(base string, args interface{}, rtype ResponseType) 
(*Response, error) {
+func (c *Client) doUpdateMethod(method string, base string, args interface{}, 
rtype ResponseType) (*Response, error) {
        uri := c.url(shared.APIVersion, base)
 
        buf := bytes.Buffer{}
@@ -412,9 +412,9 @@ func (c *Client) put(base string, args interface{}, rtype 
ResponseType) (*Respon
                return nil, err
        }
 
-       shared.LogDebugf("Putting %s to %s", buf.String(), uri)
+       shared.LogDebugf("%s %s to %s", method, buf.String(), uri)
 
-       req, err := http.NewRequest("PUT", uri, &buf)
+       req, err := http.NewRequest(method, uri, &buf)
        if err != nil {
                return nil, err
        }
@@ -429,30 +429,20 @@ func (c *Client) put(base string, args interface{}, rtype 
ResponseType) (*Respon
        return HoistResponse(resp, rtype)
 }
 
-func (c *Client) post(base string, args interface{}, rtype ResponseType) 
(*Response, error) {
-       uri := c.url(shared.APIVersion, base)
-
-       buf := bytes.Buffer{}
-       err := json.NewEncoder(&buf).Encode(args)
-       if err != nil {
-               return nil, err
-       }
-
-       shared.LogDebugf("Posting %s to %s", buf.String(), uri)
+func (c *Client) put(base string, args interface{}, rtype ResponseType) 
(*Response, error) {
+       return c.doUpdateMethod("PUT", base, args, rtype)
+}
 
-       req, err := http.NewRequest("POST", uri, &buf)
-       if err != nil {
-               return nil, err
-       }
-       req.Header.Set("User-Agent", shared.UserAgent)
-       req.Header.Set("Content-Type", "application/json")
+func (c *Client) patch(base string, args interface{}, rtype ResponseType) 
(*Response, error) {
+       return c.doUpdateMethod("PATCH", base, args, rtype)
+}
 
-       resp, err := c.Http.Do(req)
-       if err != nil {
-               return nil, err
-       }
+func (c *Client) post(base string, args interface{}, rtype ResponseType) 
(*Response, error) {
+       return c.doUpdateMethod("POST", base, args, rtype)
+}
 
-       return HoistResponse(resp, rtype)
+func (c *Client) delete(base string, args interface{}, rtype ResponseType) 
(*Response, error) {
+       return c.doUpdateMethod("DELETE", base, args, rtype)
 }
 
 func (c *Client) getRaw(uri string) (*http.Response, error) {
@@ -479,32 +469,6 @@ func (c *Client) getRaw(uri string) (*http.Response, 
error) {
        return raw, nil
 }
 
-func (c *Client) delete(base string, args interface{}, rtype ResponseType) 
(*Response, error) {
-       uri := c.url(shared.APIVersion, base)
-
-       buf := bytes.Buffer{}
-       err := json.NewEncoder(&buf).Encode(args)
-       if err != nil {
-               return nil, err
-       }
-
-       shared.LogDebugf("Deleting %s to %s", buf.String(), uri)
-
-       req, err := http.NewRequest("DELETE", uri, &buf)
-       if err != nil {
-               return nil, err
-       }
-       req.Header.Set("User-Agent", shared.UserAgent)
-       req.Header.Set("Content-Type", "application/json")
-
-       resp, err := c.Http.Do(req)
-       if err != nil {
-               return nil, err
-       }
-
-       return HoistResponse(resp, rtype)
-}
-
 func (c *Client) Websocket(operation string, secret string) (*websocket.Conn, 
error) {
        query := url.Values{"secret": []string{secret}}
        url := c.BaseWSURL + path.Join(operation, "websocket") + "?" + 
query.Encode()

From c07feceae7b28c386c1e8393c6f40f6062a05cd5 Mon Sep 17 00:00:00 2001
From: Tycho Andersen <[email protected]>
Date: Fri, 2 Dec 2016 12:24:40 -0700
Subject: [PATCH 2/5] add some extra response types

Signed-off-by: Tycho Andersen <[email protected]>
---
 lxd/response.go | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/lxd/response.go b/lxd/response.go
index 1116857..235dd3b 100644
--- a/lxd/response.go
+++ b/lxd/response.go
@@ -292,6 +292,29 @@ func PreconditionFailed(err error) Response {
        return &errorResponse{http.StatusPreconditionFailed, err.Error()}
 }
 
+func ServiceUnavailable(err error) Response {
+       return &errorResponse{http.StatusServiceUnavailable, err.Error()}
+}
+
+type redirectResponse struct {
+       req   *http.Request
+       type_ int
+       url   string
+}
+
+func (rr *redirectResponse) Render(w http.ResponseWriter) error {
+       http.Redirect(w, rr.req, rr.url, rr.type_)
+       return nil
+}
+
+func (rr *redirectResponse) String() string {
+       return fmt.Sprintf("redirect (%d) to %s", rr.type_, rr.url)
+}
+
+func Redirect(r *http.Request, url string) Response {
+       return &redirectResponse{r, http.StatusMovedPermanently, url}
+}
+
 /*
  * SmartError returns the right error message based on err.
  */

From b05b02fb3294f223e16e7469d2927af11ce1a4c5 Mon Sep 17 00:00:00 2001
From: Tycho Andersen <[email protected]>
Date: Wed, 7 Dec 2016 16:15:24 +0100
Subject: [PATCH 3/5] tests: only attach lxdbr0 if it is present on the host

Signed-off-by: Tycho Andersen <[email protected]>
---
 test/main.sh | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/test/main.sh b/test/main.sh
index f94e85c..e5a88a1 100755
--- a/test/main.sh
+++ b/test/main.sh
@@ -103,7 +103,11 @@ spawn_lxd() {
   fi
 
   echo "==> Setting up networking"
-  LXD_DIR="${lxddir}" lxc network attach-profile lxdbr0 default eth0
+  bad=0
+  ip link show lxdbr0 || bad=1
+  if [ "${bad}" -eq 0 ]; then
+    LXD_DIR="${lxddir}" lxc network attach-profile lxdbr0 default eth0
+  fi
 
   echo "==> Configuring storage backend"
   "$LXD_BACKEND"_configure "${lxddir}"

From 65a3ae2f66e16302733aedbcf65142645d5ab681 Mon Sep 17 00:00:00 2001
From: Tycho Andersen <[email protected]>
Date: Wed, 7 Dec 2016 16:15:53 +0100
Subject: [PATCH 4/5] shared: make PrintStack print at the Error level

This is used for debugging, and --debug is very verbose and sometimes I
don't want to have to wade through it. So let's use Error instead :)

Signed-off-by: Tycho Andersen <[email protected]>
---
 shared/log.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/shared/log.go b/shared/log.go
index 792ccf6..f696feb 100644
--- a/shared/log.go
+++ b/shared/log.go
@@ -93,5 +93,5 @@ func LogCritf(format string, args ...interface{}) {
 func PrintStack() {
        buf := make([]byte, 1<<16)
        runtime.Stack(buf, true)
-       LogDebugf("%s", buf)
+       LogErrorf("%s", buf)
 }

From 9b2bb51fcc72f190727fd32742d63301cfd1e0a8 Mon Sep 17 00:00:00 2001
From: Tycho Andersen <[email protected]>
Date: Thu, 8 Dec 2016 17:26:24 +0100
Subject: [PATCH 5/5] make a helper to compute cert fingerprint

Signed-off-by: Tycho Andersen <[email protected]>
---
 client.go      |  9 ++++-----
 shared/cert.go | 11 +++++++++++
 2 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/client.go b/client.go
index a4265aa..0c45ca5 100644
--- a/client.go
+++ b/client.go
@@ -2,7 +2,6 @@ package lxd
 
 import (
        "bytes"
-       "crypto/sha256"
        "crypto/x509"
        "encoding/base64"
        "encoding/json"
@@ -1676,10 +1675,10 @@ func (c *Client) ServerStatus() (*shared.ServerState, 
error) {
 
        // Fill in certificate fingerprint if not provided
        if ss.Environment.CertificateFingerprint == "" && 
ss.Environment.Certificate != "" {
-               pemCertificate, _ := 
pem.Decode([]byte(ss.Environment.Certificate))
-               if pemCertificate != nil {
-                       digest := sha256.Sum256(pemCertificate.Bytes)
-                       ss.Environment.CertificateFingerprint = 
fmt.Sprintf("%x", digest)
+               var err error
+               ss.Environment.CertificateFingerprint, err = 
shared.CertFingerprint(ss.Environment.Certificate)
+               if err != nil {
+                       return nil, err
                }
        }
 
diff --git a/shared/cert.go b/shared/cert.go
index ebd5604..91be153 100644
--- a/shared/cert.go
+++ b/shared/cert.go
@@ -8,6 +8,7 @@ package shared
 import (
        "crypto/rand"
        "crypto/rsa"
+       "crypto/sha256"
        "crypto/x509"
        "crypto/x509/pkix"
        "encoding/pem"
@@ -211,3 +212,13 @@ func ReadCert(fpath string) (*x509.Certificate, error) {
 
        return x509.ParseCertificate(certBlock.Bytes)
 }
+
+func CertFingerprint(c string) (string, error) {
+       pemCertificate, _ := pem.Decode([]byte(c))
+       if pemCertificate != nil {
+               digest := sha256.Sum256(pemCertificate.Bytes)
+               return fmt.Sprintf("%x", digest), nil
+       }
+
+       return "", fmt.Errorf("invalid certificate")
+}
_______________________________________________
lxc-devel mailing list
[email protected]
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to