[lxc-devel] [lxd/master] More API tweaks and fixes

stgraber on Github lxc-bot at linuxcontainers.org
Thu Apr 25 21:08:39 UTC 2019


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 301 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20190425/24f81c0e/attachment.bin>
-------------- next part --------------
From 437ad517e6dc4b09bb70f6d428562d458d5cb06a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Thu, 25 Apr 2019 16:47:33 -0400
Subject: [PATCH 1/3] lxd/network: Fix DNS records for projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxd/networks_utils.go | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/lxd/networks_utils.go b/lxd/networks_utils.go
index a7de30c088..c3afbae9ac 100644
--- a/lxd/networks_utils.go
+++ b/lxd/networks_utils.go
@@ -896,7 +896,7 @@ func networkUpdateStatic(s *state.State, networkName string) error {
 				entries[d["parent"]] = [][]string{}
 			}
 
-			entries[d["parent"]] = append(entries[d["parent"]], []string{d["hwaddr"], projectPrefix(c.Project(), c.Name()), d["ipv4.address"], d["ipv6.address"]})
+			entries[d["parent"]] = append(entries[d["parent"]], []string{d["hwaddr"], c.Project(), c.Name(), d["ipv4.address"], d["ipv6.address"]})
 		}
 	}
 
@@ -931,36 +931,37 @@ func networkUpdateStatic(s *state.State, networkName string) error {
 		// Apply the changes
 		for entryIdx, entry := range entries {
 			hwaddr := entry[0]
-			cName := entry[1]
-			ipv4Address := entry[2]
-			ipv6Address := entry[3]
+			project := entry[1]
+			cName := entry[2]
+			ipv4Address := entry[3]
+			ipv6Address := entry[4]
 			line := hwaddr
 
 			// Look for duplicates
 			duplicate := false
 			for iIdx, i := range entries {
-				if entry[1] == i[1] {
+				if projectPrefix(entry[1], entry[2]) == projectPrefix(i[1], i[2]) {
 					// Skip ourselves
 					continue
 				}
 
 				if entry[0] == i[0] {
 					// Find broken configurations
-					logger.Errorf("Duplicate MAC detected: %s and %s", entry[1], i[1])
+					logger.Errorf("Duplicate MAC detected: %s and %s", projectPrefix(entry[1], entry[2]), projectPrefix(i[1], i[2]))
 				}
 
-				if i[2] == "" && i[3] == "" {
+				if i[3] == "" && i[4] == "" {
 					// Skip unconfigured
 					continue
 				}
 
-				if entry[2] == i[2] && entry[3] == i[3] {
+				if entry[3] == i[3] && entry[4] == i[4] {
 					// Find identical containers (copies with static configuration)
 					if entryIdx > iIdx {
 						duplicate = true
 					} else {
 						line = fmt.Sprintf("%s,%s", line, i[0])
-						logger.Debugf("Found containers with duplicate IPv4/IPv6: %s and %s", entry[1], i[1])
+						logger.Debugf("Found containers with duplicate IPv4/IPv6: %s and %s", projectPrefix(entry[1], entry[2]), projectPrefix(i[1], i[2]))
 					}
 				}
 			}
@@ -986,7 +987,7 @@ func networkUpdateStatic(s *state.State, networkName string) error {
 				continue
 			}
 
-			err := ioutil.WriteFile(shared.VarPath("networks", network, "dnsmasq.hosts", cName), []byte(line+"\n"), 0644)
+			err := ioutil.WriteFile(shared.VarPath("networks", network, "dnsmasq.hosts", projectPrefix(project, cName)), []byte(line+"\n"), 0644)
 			if err != nil {
 				return err
 			}

From 26409167ba9e7447928c887160378faf82969100 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Thu, 25 Apr 2019 17:06:32 -0400
Subject: [PATCH 2/3] lxd/network: Filter leases by project
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxd/networks.go | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/lxd/networks.go b/lxd/networks.go
index 1f5494b0ff..8882800842 100644
--- a/lxd/networks.go
+++ b/lxd/networks.go
@@ -665,6 +665,7 @@ func doNetworkUpdate(d *Daemon, name string, oldConfig map[string]string, req ap
 
 func networkLeasesGet(d *Daemon, r *http.Request) Response {
 	name := mux.Vars(r)["name"]
+	project := projectParam(r)
 
 	// Try to get the network
 	n, err := doNetworkGet(d, name)
@@ -678,11 +679,12 @@ func networkLeasesGet(d *Daemon, r *http.Request) Response {
 	}
 
 	leases := []api.NetworkLease{}
+	projectMacs := []string{}
 
 	// Get all static leases
 	if !isClusterNotification(r) {
 		// Get all the containers
-		containers, err := containerLoadFromAllProjects(d.State())
+		containers, err := containerLoadByProject(d.State(), project)
 		if err != nil {
 			return SmartError(err)
 		}
@@ -701,6 +703,11 @@ func networkLeasesGet(d *Daemon, r *http.Request) Response {
 					continue
 				}
 
+				// Record the MAC
+				if d["hwaddr"] != "" {
+					projectMacs = append(projectMacs, d["hwaddr"])
+				}
+
 				// Add the lease
 				if d["ipv4.address"] != "" {
 					leases = append(leases, api.NetworkLease{
@@ -800,6 +807,18 @@ func networkLeasesGet(d *Daemon, r *http.Request) Response {
 		if err != nil {
 			return SmartError(err)
 		}
+
+		// Filter based on project
+		filteredLeases := []api.NetworkLease{}
+		for _, lease := range leases {
+			if !shared.StringInSlice(lease.Hwaddr, projectMacs) {
+				continue
+			}
+
+			filteredLeases = append(filteredLeases, lease)
+		}
+
+		leases = filteredLeases
 	}
 
 	return SyncResponse(true, leases)

From f5a64c26302f121bcd594ea3b40b979bff1cac15 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Wed, 24 Apr 2019 19:14:38 -0400
Subject: [PATCH 3/3] lxd/api: Handle AccessHandler
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxd/daemon.go | 35 ++++++++++++++++++++---------------
 1 file changed, 20 insertions(+), 15 deletions(-)

diff --git a/lxd/daemon.go b/lxd/daemon.go
index 254936a982..06820f6065 100644
--- a/lxd/daemon.go
+++ b/lxd/daemon.go
@@ -377,27 +377,32 @@ func (d *Daemon) createCmd(restAPI *mux.Router, version string, c APIEndpoint) {
 		var resp Response
 		resp = NotImplemented(nil)
 
+		handleRequest := func(action APIEndpointAction) Response {
+			if action.Handler == nil {
+				return NotImplemented(nil)
+			}
+
+			if action.AccessHandler != nil {
+				resp := action.AccessHandler(d, r)
+				if resp != EmptySyncResponse {
+					return resp
+				}
+			}
+
+			return action.Handler(d, r)
+		}
+
 		switch r.Method {
 		case "GET":
-			if c.Get.Handler != nil {
-				resp = c.Get.Handler(d, r)
-			}
+			resp = handleRequest(c.Get)
 		case "PUT":
-			if c.Put.Handler != nil {
-				resp = c.Put.Handler(d, r)
-			}
+			resp = handleRequest(c.Put)
 		case "POST":
-			if c.Post.Handler != nil {
-				resp = c.Post.Handler(d, r)
-			}
+			resp = handleRequest(c.Post)
 		case "DELETE":
-			if c.Delete.Handler != nil {
-				resp = c.Delete.Handler(d, r)
-			}
+			resp = handleRequest(c.Delete)
 		case "PATCH":
-			if c.Patch.Handler != nil {
-				resp = c.Patch.Handler(d, r)
-			}
+			resp = handleRequest(c.Patch)
 		default:
 			resp = NotFound(fmt.Errorf("Method '%s' not found", r.Method))
 		}


More information about the lxc-devel mailing list