mirror of
				https://github.com/docker/compose.git
				synced 2025-11-03 21:25:21 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			180 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			180 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
/*
 | 
						|
   Copyright 2020 Docker Compose CLI authors
 | 
						|
 | 
						|
   Licensed 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 convert
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"io/ioutil"
 | 
						|
	"os"
 | 
						|
	"path"
 | 
						|
	"testing"
 | 
						|
 | 
						|
	"github.com/compose-spec/compose-go/types"
 | 
						|
	"gotest.tools/v3/assert"
 | 
						|
)
 | 
						|
 | 
						|
func TestConvertSecrets(t *testing.T) {
 | 
						|
	serviceName := "testservice"
 | 
						|
	secretName := "testsecret"
 | 
						|
	absBasePath := "/home/user"
 | 
						|
	tmpFile, err := ioutil.TempFile(os.TempDir(), "TestConvertProjectSecrets-")
 | 
						|
	assert.NilError(t, err)
 | 
						|
	_, err = tmpFile.Write([]byte("test content"))
 | 
						|
	assert.NilError(t, err)
 | 
						|
	t.Cleanup(func() {
 | 
						|
		_ = os.Remove(tmpFile.Name())
 | 
						|
	})
 | 
						|
 | 
						|
	t.Run("mix default and absolute", func(t *testing.T) {
 | 
						|
		pSquashedDefaultAndAbs := projectAciHelper{
 | 
						|
			Services: []types.ServiceConfig{
 | 
						|
				{
 | 
						|
					Name: serviceName,
 | 
						|
					Secrets: []types.ServiceSecretConfig{
 | 
						|
						{
 | 
						|
							Source: secretName,
 | 
						|
							Target: "some_target1",
 | 
						|
						},
 | 
						|
						{
 | 
						|
							Source: secretName,
 | 
						|
						},
 | 
						|
						{
 | 
						|
							Source: secretName,
 | 
						|
							Target: path.Join(defaultSecretsPath, "some_target2"),
 | 
						|
						},
 | 
						|
						{
 | 
						|
							Source: secretName,
 | 
						|
							Target: path.Join(absBasePath, "some_target3"),
 | 
						|
						},
 | 
						|
						{
 | 
						|
							Source: secretName,
 | 
						|
							Target: path.Join(absBasePath, "some_target4"),
 | 
						|
						},
 | 
						|
					},
 | 
						|
				},
 | 
						|
			},
 | 
						|
			Secrets: map[string]types.SecretConfig{
 | 
						|
				secretName: {
 | 
						|
					File: tmpFile.Name(),
 | 
						|
				},
 | 
						|
			},
 | 
						|
		}
 | 
						|
		volumes, err := pSquashedDefaultAndAbs.getAciSecretVolumes()
 | 
						|
		assert.NilError(t, err)
 | 
						|
		assert.Equal(t, len(volumes), 2)
 | 
						|
 | 
						|
		defaultVolumeName := getServiceSecretKey(serviceName, defaultSecretsPath)
 | 
						|
		homeVolumeName := getServiceSecretKey(serviceName, absBasePath)
 | 
						|
		// random order since this was created from a map...
 | 
						|
		for _, vol := range volumes {
 | 
						|
			switch *vol.Name {
 | 
						|
			case defaultVolumeName:
 | 
						|
				assert.Equal(t, len(vol.Secret), 3)
 | 
						|
			case homeVolumeName:
 | 
						|
				assert.Equal(t, len(vol.Secret), 2)
 | 
						|
			default:
 | 
						|
				assert.Assert(t, false, "unexpected volume name: "+*vol.Name)
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		s := serviceConfigAciHelper(pSquashedDefaultAndAbs.Services[0])
 | 
						|
		vms, err := s.getAciSecretsVolumeMounts()
 | 
						|
		assert.NilError(t, err)
 | 
						|
		assert.Equal(t, len(vms), 2)
 | 
						|
 | 
						|
		assert.Equal(t, *vms[0].Name, defaultVolumeName)
 | 
						|
		assert.Equal(t, *vms[0].MountPath, defaultSecretsPath)
 | 
						|
 | 
						|
		assert.Equal(t, *vms[1].Name, homeVolumeName)
 | 
						|
		assert.Equal(t, *vms[1].MountPath, absBasePath)
 | 
						|
	})
 | 
						|
 | 
						|
	t.Run("convert invalid target", func(t *testing.T) {
 | 
						|
		targetName := "some/invalid/relative/path/target"
 | 
						|
		pInvalidRelativePathTarget := projectAciHelper{
 | 
						|
			Services: []types.ServiceConfig{
 | 
						|
				{
 | 
						|
					Name: serviceName,
 | 
						|
					Secrets: []types.ServiceSecretConfig{
 | 
						|
						{
 | 
						|
							Source: secretName,
 | 
						|
							Target: targetName,
 | 
						|
						},
 | 
						|
					},
 | 
						|
				},
 | 
						|
			},
 | 
						|
			Secrets: map[string]types.SecretConfig{
 | 
						|
				secretName: {
 | 
						|
					File: tmpFile.Name(),
 | 
						|
				},
 | 
						|
			},
 | 
						|
		}
 | 
						|
		_, err := pInvalidRelativePathTarget.getAciSecretVolumes()
 | 
						|
		assert.Equal(t, err.Error(),
 | 
						|
			fmt.Sprintf(`in service %q, secret with source %q cannot have a relative path as target. Only absolute paths are allowed. Found %q`,
 | 
						|
				serviceName, secretName, targetName))
 | 
						|
	})
 | 
						|
 | 
						|
	t.Run("convert colliding default targets", func(t *testing.T) {
 | 
						|
		targetName1 := path.Join(defaultSecretsPath, "target1")
 | 
						|
		targetName2 := path.Join(defaultSecretsPath, "sub/folder/target2")
 | 
						|
 | 
						|
		service := serviceConfigAciHelper{
 | 
						|
			Name: serviceName,
 | 
						|
			Secrets: []types.ServiceSecretConfig{
 | 
						|
				{
 | 
						|
					Source: secretName,
 | 
						|
					Target: targetName1,
 | 
						|
				},
 | 
						|
				{
 | 
						|
					Source: secretName,
 | 
						|
					Target: targetName2,
 | 
						|
				},
 | 
						|
			},
 | 
						|
		}
 | 
						|
 | 
						|
		_, err := service.getAciSecretsVolumeMounts()
 | 
						|
		assert.Equal(t, err.Error(),
 | 
						|
			fmt.Sprintf(`mount paths %q and %q collide. A volume mount cannot include another one.`,
 | 
						|
				path.Dir(targetName1), path.Dir(targetName2)))
 | 
						|
	})
 | 
						|
 | 
						|
	t.Run("convert colliding absolute targets", func(t *testing.T) {
 | 
						|
		targetName1 := path.Join(absBasePath, "target1")
 | 
						|
		targetName2 := path.Join(absBasePath, "sub/folder/target2")
 | 
						|
 | 
						|
		service := serviceConfigAciHelper{
 | 
						|
			Name: serviceName,
 | 
						|
			Secrets: []types.ServiceSecretConfig{
 | 
						|
				{
 | 
						|
					Source: secretName,
 | 
						|
					Target: targetName1,
 | 
						|
				},
 | 
						|
				{
 | 
						|
					Source: secretName,
 | 
						|
					Target: targetName2,
 | 
						|
				},
 | 
						|
			},
 | 
						|
		}
 | 
						|
 | 
						|
		_, err := service.getAciSecretsVolumeMounts()
 | 
						|
		assert.Equal(t, err.Error(),
 | 
						|
			fmt.Sprintf(`mount paths %q and %q collide. A volume mount cannot include another one.`,
 | 
						|
				path.Dir(targetName1), path.Dir(targetName2)))
 | 
						|
	})
 | 
						|
}
 |