forked from toolshed/abra
		
	
		
			
				
	
	
		
			90 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package client
 | 
						|
 | 
						|
import (
 | 
						|
	"errors"
 | 
						|
	"fmt"
 | 
						|
 | 
						|
	"coopcloud.tech/abra/pkg/context"
 | 
						|
	"coopcloud.tech/abra/pkg/i18n"
 | 
						|
	"coopcloud.tech/abra/pkg/log"
 | 
						|
	commandconnPkg "coopcloud.tech/abra/pkg/upstream/commandconn"
 | 
						|
	dConfig "github.com/docker/cli/cli/config"
 | 
						|
	"github.com/docker/cli/cli/context/docker"
 | 
						|
	contextStore "github.com/docker/cli/cli/context/store"
 | 
						|
)
 | 
						|
 | 
						|
type Context = contextStore.Metadata
 | 
						|
 | 
						|
// CreateContext creates a new Docker context.
 | 
						|
func CreateContext(contextName string) error {
 | 
						|
	host := fmt.Sprintf("ssh://%s", contextName)
 | 
						|
 | 
						|
	if err := createContext(contextName, host); err != nil {
 | 
						|
		return err
 | 
						|
	}
 | 
						|
 | 
						|
	log.Debug(i18n.G("created the %s context", contextName))
 | 
						|
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
// createContext interacts with Docker Context to create a Docker context config
 | 
						|
func createContext(name string, host string) error {
 | 
						|
	s := context.NewDefaultDockerContextStore()
 | 
						|
	contextMetadata := contextStore.Metadata{
 | 
						|
		Endpoints: make(map[string]interface{}),
 | 
						|
		Name:      name,
 | 
						|
	}
 | 
						|
 | 
						|
	contextTLSData := contextStore.ContextTLSData{
 | 
						|
		Endpoints: make(map[string]contextStore.EndpointTLSData),
 | 
						|
	}
 | 
						|
 | 
						|
	dockerEP, dockerTLS, err := commandconnPkg.GetDockerEndpointMetadataAndTLS(host)
 | 
						|
	if err != nil {
 | 
						|
		return err
 | 
						|
	}
 | 
						|
 | 
						|
	contextMetadata.Endpoints[docker.DockerEndpoint] = dockerEP
 | 
						|
	if dockerTLS != nil {
 | 
						|
		contextTLSData.Endpoints[docker.DockerEndpoint] = *dockerTLS
 | 
						|
	}
 | 
						|
 | 
						|
	if err := s.CreateOrUpdate(contextMetadata); err != nil {
 | 
						|
		return err
 | 
						|
	}
 | 
						|
 | 
						|
	if err := s.ResetTLSMaterial(name, &contextTLSData); err != nil {
 | 
						|
		return err
 | 
						|
	}
 | 
						|
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
func DeleteContext(name string) error {
 | 
						|
	if name == "default" {
 | 
						|
		return errors.New(i18n.G("context 'default' cannot be removed"))
 | 
						|
	}
 | 
						|
 | 
						|
	if _, err := GetContext(name); err != nil {
 | 
						|
		return err
 | 
						|
	}
 | 
						|
 | 
						|
	cfg := dConfig.LoadDefaultConfigFile(nil)
 | 
						|
	cfg.CurrentContext = ""
 | 
						|
	if err := cfg.Save(); err != nil {
 | 
						|
		return err
 | 
						|
	}
 | 
						|
 | 
						|
	return context.NewDefaultDockerContextStore().Remove(name)
 | 
						|
}
 | 
						|
 | 
						|
func GetContext(contextName string) (contextStore.Metadata, error) {
 | 
						|
	ctx, err := context.NewDefaultDockerContextStore().GetMetadata(contextName)
 | 
						|
	if err != nil {
 | 
						|
		return contextStore.Metadata{}, err
 | 
						|
	}
 | 
						|
 | 
						|
	return ctx, nil
 | 
						|
}
 |