Przeglądaj źródła

update to support new target in swarmkit

Signed-off-by: Evan Hazlett <ejhazlett@gmail.com>
Evan Hazlett 8 lat temu
rodzic
commit
88dea0e06e

+ 2 - 2
api/types/container/secret.go

@@ -6,7 +6,7 @@ type ContainerSecret struct {
 	Name   string
 	Target string
 	Data   []byte
-	Uid    int
-	Gid    int
+	UID    int
+	GID    int
 	Mode   os.FileMode
 }

+ 9 - 9
api/types/swarm/secret.go

@@ -1,5 +1,7 @@
 package swarm
 
+import "os"
+
 // Secret represents a secret.
 type Secret struct {
 	ID string
@@ -14,17 +16,15 @@ type SecretSpec struct {
 	Data []byte
 }
 
-type SecretReferenceMode int
-
-const (
-	SecretReferenceSystem SecretReferenceMode = 0
-	SecretReferenceFile   SecretReferenceMode = 1
-	SecretReferenceEnv    SecretReferenceMode = 2
-)
+type SecretReferenceFileTarget struct {
+	Name string
+	UID  string
+	GID  string
+	Mode os.FileMode
+}
 
 type SecretReference struct {
 	SecretID   string
-	Mode       SecretReferenceMode
-	Target     string
 	SecretName string
+	Target     SecretReferenceFileTarget
 }

+ 7 - 2
cli/command/service/parse.go

@@ -54,8 +54,13 @@ func parseSecrets(client client.APIClient, requestedSecrets []string) ([]*swarmt
 
 		secretRef := &swarmtypes.SecretReference{
 			SecretName: n,
-			Mode:       swarmtypes.SecretReferenceFile,
-			Target:     t,
+			// TODO (ehazlett): parse these from cli request
+			Target: swarmtypes.SecretReferenceFileTarget{
+				Name: t,
+				UID:  "0",
+				GID:  "0",
+				Mode: 0444,
+			},
 		}
 
 		if _, exists := secretRefs[t]; exists {

+ 20 - 14
daemon/cluster/convert/container.go

@@ -4,6 +4,7 @@ import (
 	"fmt"
 	"strings"
 
+	"github.com/Sirupsen/logrus"
 	container "github.com/docker/docker/api/types/container"
 	mounttypes "github.com/docker/docker/api/types/mount"
 	types "github.com/docker/docker/api/types/swarm"
@@ -79,15 +80,17 @@ func containerSpecFromGRPC(c *swarmapi.ContainerSpec) types.ContainerSpec {
 func secretReferencesToGRPC(sr []*types.SecretReference) []*swarmapi.SecretReference {
 	refs := []*swarmapi.SecretReference{}
 	for _, s := range sr {
-		mode := swarmapi.SecretReference_FILE
-		if s.Mode == types.SecretReferenceSystem {
-			mode = swarmapi.SecretReference_SYSTEM
-		}
 		refs = append(refs, &swarmapi.SecretReference{
 			SecretID:   s.SecretID,
 			SecretName: s.SecretName,
-			Target:     s.Target,
-			Mode:       mode,
+			Target: &swarmapi.SecretReference_File{
+				File: &swarmapi.SecretReference_FileTarget{
+					Name: s.Target.Name,
+					UID:  s.Target.UID,
+					GID:  s.Target.GID,
+					Mode: s.Target.Mode,
+				},
+			},
 		})
 	}
 
@@ -96,18 +99,21 @@ func secretReferencesToGRPC(sr []*types.SecretReference) []*swarmapi.SecretRefer
 func secretReferencesFromGRPC(sr []*swarmapi.SecretReference) []*types.SecretReference {
 	refs := []*types.SecretReference{}
 	for _, s := range sr {
-		var mode types.SecretReferenceMode
-		switch s.Mode {
-		case swarmapi.SecretReference_SYSTEM:
-			mode = types.SecretReferenceSystem
-		default:
-			mode = types.SecretReferenceFile
+		target := s.GetFile()
+		if target == nil {
+			// not a file target
+			logrus.Warnf("secret target not a file: secret=%s", s.SecretID)
+			continue
 		}
 		refs = append(refs, &types.SecretReference{
 			SecretID:   s.SecretID,
 			SecretName: s.SecretName,
-			Target:     s.Target,
-			Mode:       mode,
+			Target: types.SecretReferenceFileTarget{
+				Name: target.Name,
+				UID:  target.UID,
+				GID:  target.GID,
+				Mode: target.Mode,
+			},
 		})
 	}
 

+ 20 - 8
daemon/cluster/executor/container/adapter.go

@@ -5,6 +5,7 @@ import (
 	"encoding/json"
 	"fmt"
 	"io"
+	"strconv"
 	"strings"
 	"syscall"
 	"time"
@@ -227,18 +228,29 @@ func (c *containerAdapter) create(ctx context.Context) error {
 		}
 
 		name := sec.Spec.Annotations.Name
-		target := s.Target
-		if target == "" {
-			target = name
+		target := s.GetFile()
+		if target == nil {
+			logrus.Warnf("secret target was not a file: secret=%s", s.SecretID)
+			continue
 		}
+		// convert uid / gid string to int
+		uid, err := strconv.Atoi(target.UID)
+		if err != nil {
+			return err
+		}
+
+		gid, err := strconv.Atoi(target.GID)
+		if err != nil {
+			return err
+		}
+
 		secrets = append(secrets, &containertypes.ContainerSecret{
 			Name:   name,
-			Target: target,
+			Target: target.Name,
 			Data:   sec.Spec.Data,
-			// TODO (ehazlett): enable configurable uid, gid, mode
-			Uid:  0,
-			Gid:  0,
-			Mode: 0444,
+			UID:    uid,
+			GID:    gid,
+			Mode:   target.Mode,
 		})
 	}
 

+ 1 - 1
daemon/container_operations_unix.go

@@ -191,7 +191,7 @@ func (daemon *Daemon) setupSecretDir(c *container.Container) (setupErr error) {
 			return errors.Wrap(err, "error injecting secret")
 		}
 
-		if err := os.Chown(fPath, s.Uid, s.Gid); err != nil {
+		if err := os.Chown(fPath, s.UID, s.GID); err != nil {
 			return errors.Wrap(err, "error setting ownership for secret")
 		}
 	}