feat: abra app move (continued) #636
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,3 +1,4 @@
|
|||||||
|
*.tar.gz
|
||||||
*fmtcoverage.html
|
*fmtcoverage.html
|
||||||
.e2e.env
|
.e2e.env
|
||||||
.envrc
|
.envrc
|
||||||
|
352
cli/app/move.go
Normal file
352
cli/app/move.go
Normal file
@ -0,0 +1,352 @@
|
|||||||
|
package app
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"coopcloud.tech/abra/cli/internal"
|
||||||
|
"coopcloud.tech/abra/pkg/app"
|
||||||
|
appPkg "coopcloud.tech/abra/pkg/app"
|
||||||
|
"coopcloud.tech/abra/pkg/autocomplete"
|
||||||
|
"coopcloud.tech/abra/pkg/client"
|
||||||
|
"coopcloud.tech/abra/pkg/config"
|
||||||
|
containerPkg "coopcloud.tech/abra/pkg/container"
|
||||||
|
"coopcloud.tech/abra/pkg/i18n"
|
||||||
|
"coopcloud.tech/abra/pkg/log"
|
||||||
|
"coopcloud.tech/abra/pkg/secret"
|
||||||
|
"coopcloud.tech/abra/pkg/upstream/stack"
|
||||||
|
"github.com/docker/docker/api/types"
|
||||||
|
containertypes "github.com/docker/docker/api/types/container"
|
||||||
|
"github.com/docker/docker/api/types/filters"
|
||||||
|
"github.com/docker/docker/api/types/mount"
|
||||||
|
"github.com/docker/docker/api/types/swarm"
|
||||||
|
"github.com/docker/docker/api/types/volume"
|
||||||
|
dockerclient "github.com/docker/docker/client"
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
// translators: `abra app move` aliases. use a comma separated list of aliases
|
||||||
|
// with no spaces in between
|
||||||
|
var appMoveAliases = i18n.G("m")
|
||||||
|
|
||||||
|
var AppMoveCommand = &cobra.Command{
|
||||||
|
// translators: `app move` command
|
||||||
|
Use: i18n.G("move <domain> <server> [flags]"),
|
||||||
|
Aliases: strings.Split(appMoveAliases, ","),
|
||||||
|
// translators: Short description for `app move` command
|
||||||
|
Short: i18n.G("Moves an app to a different server"),
|
||||||
|
Long: i18n.G(`Move an app to a differnt server.
|
||||||
|
|
||||||
|
This command will migrate an app config and copy secrets and volumes from the
|
||||||
|
old server to the new one. The app MUST be deployed on the old server before
|
||||||
|
doing the move. The app will be undeployed from the current server but not
|
||||||
|
deployed on the new server.
|
||||||
|
|
||||||
|
This command requires the "cat" command to be present on the app containers
|
||||||
|
when retrieving secrets. Some "distroless" images will not support this. Not
|
||||||
|
all apps are therefore moveable. Rsync is required on your local machine for
|
||||||
|
transferring volumes.
|
||||||
|
|
||||||
|
Do not forget to update your DNS records. Don't panic, it might take a while
|
||||||
|
for the dust to settle after you move an app. If anything goes wrong, you can
|
||||||
|
always move the app config file to the original server and deploy it there
|
||||||
|
again. No data is removed from the old server.
|
||||||
|
|
||||||
|
Use "--dry-run/-r" to see which secrets and volumes will be moved.`),
|
||||||
|
Example: i18n.G(` # move an app
|
||||||
|
abra app move nextcloud.1312.net myserver.com`),
|
||||||
|
Args: cobra.RangeArgs(1, 2),
|
||||||
|
ValidArgsFunction: func(
|
||||||
|
cmd *cobra.Command,
|
||||||
|
args []string,
|
||||||
|
toComplete string,
|
||||||
|
) ([]string, cobra.ShellCompDirective) {
|
||||||
|
switch l := len(args); l {
|
||||||
|
case 0:
|
||||||
|
return autocomplete.AppNameComplete()
|
||||||
|
case 1:
|
||||||
|
return autocomplete.ServerNameComplete()
|
||||||
|
default:
|
||||||
|
return nil, cobra.ShellCompDirectiveDefault
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
|
app := internal.ValidateApp(args)
|
||||||
|
|
||||||
|
if len(args) <= 1 {
|
||||||
|
log.Fatal(i18n.G("no server provided?"))
|
||||||
|
}
|
||||||
|
newServer := internal.ValidateServer([]string{args[1]})
|
||||||
|
|
||||||
|
if err := app.Recipe.Ensure(internal.GetEnsureContext()); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
currentServerClient, err := client.New(app.Server)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
deployMeta, err := stack.IsDeployed(context.Background(), currentServerClient, app.StackName())
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !deployMeta.IsDeployed {
|
||||||
|
log.Fatal(i18n.G("%s must first be deployed on %s before moving", app.Name, app.Server))
|
||||||
|
}
|
||||||
|
|
||||||
|
resources, err := getAppResources(currentServerClient, app)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(i18n.G("unable to retrieve %s resources on %s: %s", app.Name, app.Server, err))
|
||||||
|
}
|
||||||
|
|
||||||
|
internal.MoveOverview(app, newServer, resources.SecretNames(), resources.VolumeNames())
|
||||||
|
if err := internal.PromptProcced(); err != nil {
|
||||||
|
log.Fatal(i18n.G("bailing out: %s", err))
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Info(i18n.G("undeploying %s on %s", app.Name, app.Server))
|
||||||
|
rmOpts := stack.Remove{
|
||||||
|
Namespaces: []string{app.StackName()},
|
||||||
|
Detach: false,
|
||||||
|
}
|
||||||
|
if err := stack.RunRemove(context.Background(), currentServerClient, rmOpts); err != nil {
|
||||||
|
log.Fatal(i18n.G("failed to remove app from %s: %s", err, app.Server))
|
||||||
|
}
|
||||||
|
|
||||||
|
newServerClient, err := client.New(newServer)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, s := range resources.SecretList {
|
||||||
|
sname := strings.Split(strings.TrimPrefix(s.Spec.Name, app.StackName()+"_"), "_")
|
||||||
|
secretName := strings.Join(sname[:len(sname)-1], "_")
|
||||||
|
data := resources.Secrets[secretName]
|
||||||
|
if err := client.StoreSecret(newServerClient, s.Spec.Name, data); err != nil {
|
||||||
|
log.Fatal(i18n.G("failed to store secret on %s: %s", err, newServer))
|
||||||
|
}
|
||||||
|
log.Info(i18n.G("created secret on %s: %s", s.Spec.Name, newServer))
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, v := range resources.Volumes {
|
||||||
|
log.Info(i18n.G("moving volume %s from %s to %s", v.Name, app.Server, newServer))
|
||||||
|
|
||||||
|
// NOTE(p4u1): Need to create the volume before copying the data, because
|
||||||
|
// when docker creates a new volume it set the folder permissions to
|
||||||
|
// root, which might be wrong. This ensures we always have the correct
|
||||||
|
// folder permissions inside the volume.
|
||||||
|
log.Debug(i18n.G("creating volume %s on %s", v.Name, newServer))
|
||||||
|
_, err := newServerClient.VolumeCreate(context.Background(), volume.CreateOptions{
|
||||||
|
Name: v.Name,
|
||||||
|
Driver: v.Driver,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(i18n.G("failed to create volume %s on %s: %s", v.Name, newServer, err))
|
||||||
|
}
|
||||||
|
|
||||||
|
outgoingFilename := fmt.Sprintf("%s_outgoing.tar.gz", v.Name)
|
||||||
|
log.Debug(i18n.G("creating %s on %s", outgoingFilename, app.Server))
|
||||||
|
tarCmd := fmt.Sprintf("sudo tar --same-owner -czhpf %s -C /var/lib/docker/volumes %s", outgoingFilename, v.Name)
|
||||||
|
cmd := exec.Command("ssh", app.Server, "-tt", tarCmd)
|
||||||
|
if out, err := cmd.CombinedOutput(); err != nil {
|
||||||
|
log.Fatal(i18n.G("%s failed on %s: output:%s err:%s", tarCmd, app.Server, string(out), err))
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Debug(i18n.G("rsyncing %s from %s to local machine", outgoingFilename, app.Server))
|
||||||
|
cmd = exec.Command("rsync", "-a", "-v", fmt.Sprintf("%s:%s", app.Server, outgoingFilename), outgoingFilename)
|
||||||
|
if out, err := cmd.CombinedOutput(); err != nil {
|
||||||
|
log.Fatal(i18n.G("failed to copy %s from %s to local machine: output:%s err:%s", outgoingFilename, app.Server, string(out), err))
|
||||||
|
}
|
||||||
|
|
||||||
|
incomingFilename := fmt.Sprintf("%s_incoming.tar.gz", v.Name)
|
||||||
|
log.Debug(i18n.G("rsyncing %s (renaming to %s) to %s from local machine", outgoingFilename, incomingFilename, newServer))
|
||||||
|
cmd = exec.Command("rsync", "-a", "-v", outgoingFilename, fmt.Sprintf("%s:%s", newServer, incomingFilename))
|
||||||
|
if out, err := cmd.CombinedOutput(); err != nil {
|
||||||
|
log.Fatal(i18n.G("failed to copy %s from local machine to %s: output:%s err:%s", outgoingFilename, newServer, string(out), err))
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Debug(i18n.G("extracting %s on %s", incomingFilename, newServer))
|
||||||
|
tarExtractCmd := fmt.Sprintf("sudo tar --same-owner -xzpf %s -C /var/lib/docker/volumes", outgoingFilename)
|
||||||
|
cmd = exec.Command("ssh", newServer, "-tt", tarExtractCmd)
|
||||||
|
if out, err := cmd.CombinedOutput(); err != nil {
|
||||||
|
log.Fatal(i18n.G("%s failed to extract %s on %s: output:%s err:%s", tarExtractCmd, outgoingFilename, newServer, string(out), err))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove tar files
|
||||||
|
log.Debug(i18n.G("removing %s from %s", incomingFilename, newServer))
|
||||||
|
cmd = exec.Command("ssh", newServer, "-tt", fmt.Sprintf("sudo rm %s", incomingFilename))
|
||||||
|
if out, err := cmd.CombinedOutput(); err != nil {
|
||||||
|
log.Fatal(i18n.G("failed to remove %s from %s: output:%s err:%s", incomingFilename, newServer, string(out), err))
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Debug(i18n.G("removing %s from %s", outgoingFilename, app.Server))
|
||||||
|
cmd = exec.Command("ssh", app.Server, "-tt", fmt.Sprintf("sudo rm %s", outgoingFilename))
|
||||||
|
if out, err := cmd.CombinedOutput(); err != nil {
|
||||||
|
log.Fatal(i18n.G("failed to remove %s from %s: output:%s err:%s", outgoingFilename, app.Server, string(out), err))
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Debug(i18n.G("removing %s from local machine", outgoingFilename))
|
||||||
|
cmd = exec.Command("rm", outgoingFilename)
|
||||||
|
if out, err := cmd.CombinedOutput(); err != nil {
|
||||||
|
log.Fatal(i18n.G("failed to remove %s on local machine: output:%s err:%s", outgoingFilename, string(out), err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
newServerPath := fmt.Sprintf("%s/servers/%s/%s.env", config.ABRA_DIR, newServer, app.Name)
|
||||||
|
log.Info(i18n.G("migrating app config from %s to %s", app.Server, newServerPath))
|
||||||
|
if err := copyFile(app.Path, newServerPath); err != nil {
|
||||||
|
log.Fatal(i18n.G("failed to migrate app config: %s", err))
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := os.Remove(app.Path); err != nil {
|
||||||
|
log.Fatal(i18n.G("unable to remove %s: %s", app.Path, err))
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Info(i18n.G("%s was successfully moved from %s to %s 🎉", app.Name, app.Server, newServer))
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
type AppResources struct {
|
||||||
|
Secrets map[string]string
|
||||||
|
SecretList []swarm.Secret
|
||||||
|
Volumes map[string]containertypes.MountPoint
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AppResources) SecretNames() []string {
|
||||||
|
secrets := []string{}
|
||||||
|
for name := range a.Secrets {
|
||||||
|
secrets = append(secrets, name)
|
||||||
|
}
|
||||||
|
return secrets
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AppResources) VolumeNames() []string {
|
||||||
|
volumes := []string{}
|
||||||
|
for name := range a.Volumes {
|
||||||
|
volumes = append(volumes, name)
|
||||||
|
}
|
||||||
|
return volumes
|
||||||
|
}
|
||||||
|
|
||||||
|
func getAppResources(cl *dockerclient.Client, app app.App) (*AppResources, error) {
|
||||||
|
filter, err := app.Filters(false, false)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
services, err := cl.ServiceList(context.Background(), types.ServiceListOptions{Filters: filter})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
composeFiles, err := app.Recipe.GetComposeFiles(app.Env)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
secretList, err := cl.SecretList(context.Background(), types.SecretListOptions{Filters: filter})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
secretConfigs, err := secret.ReadSecretsConfig(app.Path, composeFiles, app.StackName())
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
opts := stack.Deploy{Composefiles: composeFiles, Namespace: app.StackName()}
|
||||||
|
compose, err := appPkg.GetAppComposeConfig(app.Name, opts, app.Env)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resources := &AppResources{
|
||||||
|
Secrets: make(map[string]string),
|
||||||
|
SecretList: secretList,
|
||||||
|
Volumes: make(map[string]containertypes.MountPoint),
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, s := range services {
|
||||||
|
secretNames := map[string]string{}
|
||||||
|
for _, serviceCompose := range compose.Services {
|
||||||
|
stackService := fmt.Sprintf("%s_%s", app.StackName(), serviceCompose.Name)
|
||||||
|
if stackService != s.Spec.Name {
|
||||||
|
log.Debug(i18n.G("skipping %s as it does not match %s", stackService, s.Spec.Name))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, secret := range serviceCompose.Secrets {
|
||||||
|
for _, s := range secretList {
|
||||||
|
stackSecret := fmt.Sprintf("%s_%s_%s", app.StackName(), secret.Source, secretConfigs[secret.Source].Version)
|
||||||
|
if s.Spec.Name == stackSecret {
|
||||||
|
secretNames[secret.Source] = s.ID
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
f := filters.NewArgs()
|
||||||
|
f.Add("name", s.Spec.Name)
|
||||||
|
targetContainer, err := containerPkg.GetContainer(context.Background(), cl, f, true)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.New(i18n.G("unable to get container matching %s: %s", s.Spec.Name, err))
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, m := range targetContainer.Mounts {
|
||||||
|
if m.Type == mount.TypeVolume {
|
||||||
|
resources.Volumes[m.Name] = m
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for secretName, secretID := range secretNames {
|
||||||
|
if _, ok := resources.Secrets[secretName]; ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Debug(i18n.G("extracting secret %s on %s", secretName, app.Server))
|
||||||
|
|
||||||
|
cmd := fmt.Sprintf("sudo cat /var/lib/docker/containers/%s/mounts/secrets/%s", targetContainer.ID, secretID)
|
||||||
|
out, err := exec.Command("ssh", app.Server, "-tt", cmd).Output()
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.New(i18n.G("%s failed on %s: output:%s err:%s", cmd, app.Server, string(out), err))
|
||||||
|
}
|
||||||
|
|
||||||
|
resources.Secrets[secretName] = string(out)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return resources, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func copyFile(src string, dst string) error {
|
||||||
|
// Read all content of src to data, may cause OOM for a large file.
|
||||||
|
data, err := os.ReadFile(src)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write data to dst
|
||||||
|
err = os.WriteFile(dst, data, 0o644)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
AppMoveCommand.Flags().BoolVarP(
|
||||||
|
&internal.Dry,
|
||||||
|
i18n.G("dry-run"),
|
||||||
|
i18n.G("r"),
|
||||||
|
false,
|
||||||
|
i18n.G("report changes that would be made"),
|
||||||
|
)
|
||||||
|
}
|
@ -247,7 +247,7 @@ environment. Typically, you can let Abra generate them for you on app creation
|
|||||||
}
|
}
|
||||||
|
|
||||||
secretName := fmt.Sprintf("%s_%s_%s", app.StackName(), name, version)
|
secretName := fmt.Sprintf("%s_%s_%s", app.StackName(), name, version)
|
||||||
if err := client.StoreSecret(cl, secretName, data, app.Server); err != nil {
|
if err := client.StoreSecret(cl, secretName, data); err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -142,6 +142,69 @@ func getDeployType(currentVersion, newVersion string) string {
|
|||||||
return i18n.G("DOWNGRADE")
|
return i18n.G("DOWNGRADE")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MoveOverview shows a overview before moving an app to a different server
|
||||||
|
func MoveOverview(
|
||||||
|
app appPkg.App,
|
||||||
|
newServer string,
|
||||||
|
secrets []string,
|
||||||
|
volumes []string,
|
||||||
|
) {
|
||||||
|
server := app.Server
|
||||||
|
if app.Server == "default" {
|
||||||
|
server = "local"
|
||||||
|
}
|
||||||
|
|
||||||
|
domain := app.Domain
|
||||||
|
if domain == "" {
|
||||||
|
domain = config.NO_DOMAIN_DEFAULT
|
||||||
|
}
|
||||||
|
|
||||||
|
secretsOverview := strings.Join(secrets, "\n")
|
||||||
|
if len(secrets) == 0 {
|
||||||
|
secretsOverview = config.NO_SECRETS_DEFAULT
|
||||||
|
}
|
||||||
|
|
||||||
|
volumesOverview := strings.Join(volumes, "\n")
|
||||||
|
if len(volumes) == 0 {
|
||||||
|
volumesOverview = config.NO_VOLUMES_DEFAULT
|
||||||
|
}
|
||||||
|
|
||||||
|
rows := [][]string{
|
||||||
|
{i18n.G("DOMAIN"), domain},
|
||||||
|
{i18n.G("RECIPE"), app.Recipe.Name},
|
||||||
|
{i18n.G("OLD SERVER"), server},
|
||||||
|
{i18n.G("NEW SERVER"), newServer},
|
||||||
|
{i18n.G("SECRETS"), secretsOverview},
|
||||||
|
{i18n.G("VOLUMES"), volumesOverview},
|
||||||
|
}
|
||||||
|
|
||||||
|
overview := formatter.CreateOverview(i18n.G("MOVE OVERVIEW"), rows)
|
||||||
|
|
||||||
|
fmt.Println(overview)
|
||||||
|
}
|
||||||
|
|
||||||
|
func PromptProcced() error {
|
||||||
|
if NoInput {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if Dry {
|
||||||
|
return errors.New(i18n.G("dry run"))
|
||||||
|
}
|
||||||
|
|
||||||
|
response := false
|
||||||
|
prompt := &survey.Confirm{Message: i18n.G("proceed?")}
|
||||||
|
if err := survey.AskOne(prompt, &response); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if !response {
|
||||||
|
return errors.New(i18n.G("cancelled"))
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// PostCmds parses a string of commands and executes them inside of the respective services
|
// PostCmds parses a string of commands and executes them inside of the respective services
|
||||||
// the commands string must have the following format:
|
// the commands string must have the following format:
|
||||||
// "<service> <command> <arguments>|<service> <command> <arguments>|... "
|
// "<service> <command> <arguments>|<service> <command> <arguments>|... "
|
||||||
|
@ -258,6 +258,7 @@ Config:
|
|||||||
app.AppRestartCommand,
|
app.AppRestartCommand,
|
||||||
app.AppRestoreCommand,
|
app.AppRestoreCommand,
|
||||||
app.AppRollbackCommand,
|
app.AppRollbackCommand,
|
||||||
|
app.AppMoveCommand,
|
||||||
app.AppRunCommand,
|
app.AppRunCommand,
|
||||||
app.AppSecretCommand,
|
app.AppSecretCommand,
|
||||||
app.AppServicesCommand,
|
app.AppServicesCommand,
|
||||||
|
@ -6,6 +6,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
contextPkg "coopcloud.tech/abra/pkg/context"
|
contextPkg "coopcloud.tech/abra/pkg/context"
|
||||||
@ -38,18 +39,24 @@ func WithTimeout(timeout int) Opt {
|
|||||||
func New(serverName string, opts ...Opt) (*client.Client, error) {
|
func New(serverName string, opts ...Opt) (*client.Client, error) {
|
||||||
var clientOpts []client.Opt
|
var clientOpts []client.Opt
|
||||||
|
|
||||||
if serverName != "default" {
|
ctx, err := GetContext(serverName)
|
||||||
context, err := GetContext(serverName)
|
if err != nil {
|
||||||
if err != nil {
|
return nil, errors.New(i18n.G("unknown server, run \"abra server add %s\"?", serverName))
|
||||||
return nil, errors.New(i18n.G("unknown server, run \"abra server add %s\"?", serverName))
|
}
|
||||||
}
|
|
||||||
|
|
||||||
ctxEndpoint, err := contextPkg.GetContextEndpoint(context)
|
ctxEndpoint, err := contextPkg.GetContextEndpoint(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var isUnix bool
|
||||||
|
if strings.Contains(ctxEndpoint, "unix://") {
|
||||||
|
isUnix = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if serverName != "default" && !isUnix {
|
||||||
conf := &Conf{}
|
conf := &Conf{}
|
||||||
|
|
||||||
for _, opt := range opts {
|
for _, opt := range opts {
|
||||||
opt(conf)
|
opt(conf)
|
||||||
}
|
}
|
||||||
@ -93,7 +100,7 @@ func New(serverName string, opts ...Opt) (*client.Client, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if info.Swarm.LocalNodeState == "inactive" {
|
if info.Swarm.LocalNodeState == "inactive" {
|
||||||
if serverName != "default" {
|
if serverName != "default" && !isUnix {
|
||||||
return cl, errors.New(i18n.G("swarm mode not enabled on %s?", serverName))
|
return cl, errors.New(i18n.G("swarm mode not enabled on %s?", serverName))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@ import (
|
|||||||
"github.com/docker/docker/client"
|
"github.com/docker/docker/client"
|
||||||
)
|
)
|
||||||
|
|
||||||
func StoreSecret(cl *client.Client, secretName, secretValue, server string) error {
|
func StoreSecret(cl *client.Client, secretName, secretValue string) error {
|
||||||
ann := swarm.Annotations{Name: secretName}
|
ann := swarm.Annotations{Name: secretName}
|
||||||
spec := swarm.SecretSpec{Annotations: ann, Data: []byte(secretValue)}
|
spec := swarm.SecretSpec{Annotations: ann, Data: []byte(secretValue)}
|
||||||
|
|
||||||
|
@ -118,6 +118,8 @@ var (
|
|||||||
|
|
||||||
NO_DOMAIN_DEFAULT = "N/A"
|
NO_DOMAIN_DEFAULT = "N/A"
|
||||||
NO_VERSION_DEFAULT = "N/A"
|
NO_VERSION_DEFAULT = "N/A"
|
||||||
|
NO_SECRETS_DEFAULT = "N/A"
|
||||||
|
NO_VOLUMES_DEFAULT = "N/A"
|
||||||
|
|
||||||
UNKNOWN_DEFAULT = "unknown"
|
UNKNOWN_DEFAULT = "unknown"
|
||||||
)
|
)
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr "Project-Id-Version: \n"
|
msgstr "Project-Id-Version: \n"
|
||||||
"Report-Msgid-Bugs-To: EMAIL\n"
|
"Report-Msgid-Bugs-To: EMAIL\n"
|
||||||
"POT-Creation-Date: 2025-08-30 12:43+0200\n"
|
"POT-Creation-Date: 2025-09-01 11:17+0200\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
@ -76,6 +76,11 @@ msgid " # list apps of all servers without live status\n"
|
|||||||
" abra app ls -r gitea"
|
" abra app ls -r gitea"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:60
|
||||||
|
msgid " # move an app\n"
|
||||||
|
" abra app move nextcloud.1312.net myserver.com"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ./cli/app/cmd.go:41
|
#: ./cli/app/cmd.go:41
|
||||||
msgid " # pass <cmd> args/flags without \"--\"\n"
|
msgid " # pass <cmd> args/flags without \"--\"\n"
|
||||||
" abra app cmd 1312.net app my_cmd_arg foo --user bar\n"
|
" abra app cmd 1312.net app my_cmd_arg foo --user bar\n"
|
||||||
@ -221,7 +226,7 @@ msgstr ""
|
|||||||
msgid "%s does not exist for %s, use /bin/sh as fallback"
|
msgid "%s does not exist for %s, use /bin/sh as fallback"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ./cli/app/cmd.go:114 ./cli/internal/deploy.go:151
|
#: ./cli/app/cmd.go:114 ./cli/internal/deploy.go:214
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s does not exist for %s?"
|
msgid "%s does not exist for %s?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -246,6 +251,16 @@ msgstr ""
|
|||||||
msgid "%s doesn't have a %s function"
|
msgid "%s doesn't have a %s function"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:158 ./cli/app/move.go:318
|
||||||
|
#, c-format
|
||||||
|
msgid "%s failed on %s: output:%s err:%s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:178
|
||||||
|
#, c-format
|
||||||
|
msgid "%s failed to extract %s on %s: output:%s err:%s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ./pkg/upstream/stack/stack.go:169
|
#: ./pkg/upstream/stack/stack.go:169
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s has been detected as deployed: %v"
|
msgid "%s has been detected as deployed: %v"
|
||||||
@ -351,6 +366,11 @@ msgstr ""
|
|||||||
msgid "%s missing from %s.env"
|
msgid "%s missing from %s.env"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:100
|
||||||
|
#, c-format
|
||||||
|
msgid "%s must first be deployed on %s before moving"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ./cli/recipe/upgrade.go:151
|
#: ./cli/recipe/upgrade.go:151
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s not considered semver-like"
|
msgid "%s not considered semver-like"
|
||||||
@ -406,6 +426,11 @@ msgstr ""
|
|||||||
msgid "%s successfully stored on server"
|
msgid "%s successfully stored on server"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:211
|
||||||
|
#, c-format
|
||||||
|
msgid "%s was successfully moved from %s to %s 🎉"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ./cli/recipe/new.go:60
|
#: ./cli/recipe/new.go:60
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s/example.git"
|
msgid "%s/example.git"
|
||||||
@ -711,7 +736,7 @@ msgstr ""
|
|||||||
msgid "DEPLOYED LABELS"
|
msgid "DEPLOYED LABELS"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ./cli/app/list.go:222 ./cli/internal/deploy.go:75
|
#: ./cli/app/list.go:222 ./cli/internal/deploy.go:75 ./cli/internal/deploy.go:173
|
||||||
msgid "DOMAIN"
|
msgid "DOMAIN"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -925,6 +950,10 @@ msgstr ""
|
|||||||
msgid "List volumes associated with an app"
|
msgid "List volumes associated with an app"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/internal/deploy.go:181
|
||||||
|
msgid "MOVE OVERVIEW"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. translators: Short description for `app backup` command group
|
#. translators: Short description for `app backup` command group
|
||||||
#: ./cli/app/backup.go:246
|
#: ./cli/app/backup.go:246
|
||||||
msgid "Manage app backups"
|
msgid "Manage app backups"
|
||||||
@ -959,6 +988,32 @@ msgstr ""
|
|||||||
msgid "Manage the recipe catalogue"
|
msgid "Manage the recipe catalogue"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:42
|
||||||
|
msgid "Move an app to a differnt server.\n"
|
||||||
|
"\n"
|
||||||
|
"This command will migrate an app config and copy secrets and volumes from the\n"
|
||||||
|
"old server to the new one. The app MUST be deployed on the old server before\n"
|
||||||
|
"doing the move. The app will be undeployed from the current server but not\n"
|
||||||
|
"deployed on the new server.\n"
|
||||||
|
"\n"
|
||||||
|
"This command requires the \"cat\" command to be present on the app containers\n"
|
||||||
|
"when retrieving secrets. Some \"distroless\" images will not support this. Not\n"
|
||||||
|
"all apps are therefore moveable. Rsync is required on your local machine for\n"
|
||||||
|
"transferring volumes.\n"
|
||||||
|
"\n"
|
||||||
|
"Do not forget to update your DNS records. Don't panic, it might take a while\n"
|
||||||
|
"for the dust to settle after you move an app. If anything goes wrong, you can\n"
|
||||||
|
"always move the app config file to the original server and deploy it there\n"
|
||||||
|
"again. No data is removed from the old server.\n"
|
||||||
|
"\n"
|
||||||
|
"Use \"--dry-run/-r\" to see which secrets and volumes will be moved."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. translators: Short description for `app move` command
|
||||||
|
#: ./cli/app/move.go:41
|
||||||
|
msgid "Moves an app to a different server"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ./cli/recipe/new.go:123
|
#: ./cli/recipe/new.go:123
|
||||||
msgid "N"
|
msgid "N"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -975,6 +1030,10 @@ msgstr ""
|
|||||||
msgid "NEW DEPLOYMENT"
|
msgid "NEW DEPLOYMENT"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/internal/deploy.go:176
|
||||||
|
msgid "NEW SERVER"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ./cli/app/secret.go:147
|
#: ./cli/app/secret.go:147
|
||||||
msgid "NOT"
|
msgid "NOT"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -991,6 +1050,10 @@ msgid "Notify on new versions for deployed apps.\n"
|
|||||||
"Use \"--major/-m\" to include new major versions."
|
"Use \"--major/-m\" to include new major versions."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/internal/deploy.go:175
|
||||||
|
msgid "OLD SERVER"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ./cli/app/volume.go:54
|
#: ./cli/app/volume.go:54
|
||||||
msgid "ON SERVER"
|
msgid "ON SERVER"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -1015,7 +1078,7 @@ msgstr ""
|
|||||||
msgid "README.md metadata filled in"
|
msgid "README.md metadata filled in"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ./cli/app/list.go:222 ./cli/internal/deploy.go:76
|
#: ./cli/app/list.go:222 ./cli/internal/deploy.go:76 ./cli/internal/deploy.go:174
|
||||||
msgid "RECIPE"
|
msgid "RECIPE"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -1135,6 +1198,10 @@ msgstr ""
|
|||||||
msgid "S"
|
msgid "S"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/internal/deploy.go:177
|
||||||
|
msgid "SECRETS"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ./cli/app/new.go:204
|
#: ./cli/app/new.go:204
|
||||||
msgid "SECRETS OVERVIEW"
|
msgid "SECRETS OVERVIEW"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -1481,6 +1548,10 @@ msgstr ""
|
|||||||
msgid "VERSION"
|
msgid "VERSION"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/internal/deploy.go:178
|
||||||
|
msgid "VOLUMES"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ./cli/recipe/reset.go:24
|
#: ./cli/recipe/reset.go:24
|
||||||
msgid "WARNING: this will delete your changes. Be Careful."
|
msgid "WARNING: this will delete your changes. Be Careful."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -1756,6 +1827,11 @@ msgstr ""
|
|||||||
msgid "bad status: %s"
|
msgid "bad status: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:110
|
||||||
|
#, c-format
|
||||||
|
msgid "bailing out: %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ./pkg/upstream/convert/volume.go:113
|
#: ./pkg/upstream/convert/volume.go:113
|
||||||
msgid "bind options are incompatible with type tmpfs"
|
msgid "bind options are incompatible with type tmpfs"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -1810,6 +1886,10 @@ msgstr ""
|
|||||||
msgid "can't separate key from value: %s (this variable is probably unset)"
|
msgid "can't separate key from value: %s (this variable is probably unset)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/internal/deploy.go:202
|
||||||
|
msgid "cancelled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ./pkg/catalogue/catalogue.go:59 ./pkg/recipe/git.go:245
|
#: ./pkg/catalogue/catalogue.go:59 ./pkg/recipe/git.go:245
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "cannot ensure %s is up-to-date, no git remotes configured"
|
msgid "cannot ensure %s is up-to-date, no git remotes configured"
|
||||||
@ -2139,11 +2219,16 @@ msgstr ""
|
|||||||
msgid "create remote directory: %s"
|
msgid "create remote directory: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ./pkg/client/client.go:88
|
#: ./pkg/client/client.go:95
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "created client for %s"
|
msgid "created client for %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:134
|
||||||
|
#, c-format
|
||||||
|
msgid "created secret on %s: %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ./cli/recipe/release.go:428
|
#: ./cli/recipe/release.go:428
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "created tag %s at %s"
|
msgid "created tag %s at %s"
|
||||||
@ -2159,6 +2244,11 @@ msgstr ""
|
|||||||
msgid "creating %s"
|
msgid "creating %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:154
|
||||||
|
#, c-format
|
||||||
|
msgid "creating %s on %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ./cli/server/add.go:175
|
#: ./cli/server/add.go:175
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "creating context with domain %s"
|
msgid "creating context with domain %s"
|
||||||
@ -2174,6 +2264,11 @@ msgstr ""
|
|||||||
msgid "creating secret %s"
|
msgid "creating secret %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:144
|
||||||
|
#, c-format
|
||||||
|
msgid "creating volume %s on %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ./pkg/lint/recipe.go:22
|
#: ./pkg/lint/recipe.go:22
|
||||||
msgid "critical"
|
msgid "critical"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -2373,6 +2468,10 @@ msgstr ""
|
|||||||
msgid "download <domain> [flags]"
|
msgid "download <domain> [flags]"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/internal/deploy.go:192
|
||||||
|
msgid "dry run"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ./pkg/git/add.go:22
|
#: ./pkg/git/add.go:22
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "dry run: adding %s"
|
msgid "dry run: adding %s"
|
||||||
@ -2415,7 +2514,7 @@ msgstr ""
|
|||||||
msgid "dry run: remote %s (%s) not created"
|
msgid "dry run: remote %s (%s) not created"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ./cli/catalogue/catalogue.go:301 ./cli/recipe/release.go:639 ./cli/recipe/sync.go:269
|
#: ./cli/app/move.go:347 ./cli/catalogue/catalogue.go:301 ./cli/recipe/release.go:639 ./cli/recipe/sync.go:269
|
||||||
msgid "dry-run"
|
msgid "dry-run"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -2537,6 +2636,16 @@ msgstr ""
|
|||||||
msgid "expected 1 service but found %v: %s"
|
msgid "expected 1 service but found %v: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:174
|
||||||
|
#, c-format
|
||||||
|
msgid "extracting %s on %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:313
|
||||||
|
#, c-format
|
||||||
|
msgid "extracting secret %s on %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. translators: `abra recipe fetch` aliases. use a comma separated list of aliases
|
#. translators: `abra recipe fetch` aliases. use a comma separated list of aliases
|
||||||
#. with no spaces in between
|
#. with no spaces in between
|
||||||
#: ./cli/app/deploy.go:347 ./cli/app/remove.go:163 ./cli/app/rollback.go:329 ./cli/app/secret.go:593 ./cli/app/upgrade.go:439 ./cli/app/volume.go:217 ./cli/recipe/fetch.go:20 ./cli/recipe/fetch.go:138
|
#: ./cli/app/deploy.go:347 ./cli/app/remove.go:163 ./cli/app/rollback.go:329 ./cli/app/secret.go:593 ./cli/app/upgrade.go:439 ./cli/app/volume.go:217 ./cli/recipe/fetch.go:20 ./cli/recipe/fetch.go:138
|
||||||
@ -2563,6 +2672,16 @@ msgstr ""
|
|||||||
msgid "failed to commit changes: %s"
|
msgid "failed to commit changes: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:164
|
||||||
|
#, c-format
|
||||||
|
msgid "failed to copy %s from %s to local machine: output:%s err:%s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:171
|
||||||
|
#, c-format
|
||||||
|
msgid "failed to copy %s from local machine to %s: output:%s err:%s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ./pkg/upstream/stack/stack.go:531
|
#: ./pkg/upstream/stack/stack.go:531
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "failed to create %s"
|
msgid "failed to create %s"
|
||||||
@ -2583,6 +2702,11 @@ msgstr ""
|
|||||||
msgid "failed to create secret %s"
|
msgid "failed to create secret %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:150
|
||||||
|
#, c-format
|
||||||
|
msgid "failed to create volume %s on %s: %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ./cli/updater/updater.go:263
|
#: ./cli/updater/updater.go:263
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "failed to determine deployed version of %s"
|
msgid "failed to determine deployed version of %s"
|
||||||
@ -2611,6 +2735,11 @@ msgstr ""
|
|||||||
msgid "failed to match chosen service"
|
msgid "failed to match chosen service"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:204
|
||||||
|
#, c-format
|
||||||
|
msgid "failed to migrate app config: %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ./pkg/client/registry.go:20
|
#: ./pkg/client/registry.go:20
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "failed to parse image %s, saw: %s"
|
msgid "failed to parse image %s, saw: %s"
|
||||||
@ -2621,6 +2750,21 @@ msgstr ""
|
|||||||
msgid "failed to publish new release: %s"
|
msgid "failed to publish new release: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:185 ./cli/app/move.go:191
|
||||||
|
#, c-format
|
||||||
|
msgid "failed to remove %s from %s: output:%s err:%s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:197
|
||||||
|
#, c-format
|
||||||
|
msgid "failed to remove %s on local machine: output:%s err:%s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:119
|
||||||
|
#, c-format
|
||||||
|
msgid "failed to remove app from %s: %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ./pkg/upstream/stack/remove.go:183
|
#: ./pkg/upstream/stack/remove.go:183
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "failed to remove config %s: %s"
|
msgid "failed to remove config %s: %s"
|
||||||
@ -2665,6 +2809,11 @@ msgstr ""
|
|||||||
msgid "failed to select default branch in %s"
|
msgid "failed to select default branch in %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:132
|
||||||
|
#, c-format
|
||||||
|
msgid "failed to store secret on %s: %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ./cli/recipe/release.go:269 ./cli/recipe/release.go:554
|
#: ./cli/recipe/release.go:269 ./cli/recipe/release.go:554
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "failed to tag release: %s"
|
msgid "failed to tag release: %s"
|
||||||
@ -3259,9 +3408,11 @@ msgstr ""
|
|||||||
msgid "ls"
|
msgid "ls"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#. translators: `abra app move` aliases. use a comma separated list of aliases
|
||||||
|
#. with no spaces in between
|
||||||
#. translators: `abra man` aliases. use a comma separated list of aliases
|
#. translators: `abra man` aliases. use a comma separated list of aliases
|
||||||
#. with no spaces in between
|
#. with no spaces in between
|
||||||
#: ./cli/app/list.go:318 ./cli/app/ps.go:205 ./cli/app/secret.go:553 ./cli/app/secret.go:649 ./cli/recipe/list.go:104 ./cli/recipe/upgrade.go:376 ./cli/recipe/version.go:139 ./cli/run.go:128 ./cli/server/list.go:106 ./cli/updater/updater.go:560
|
#: ./cli/app/list.go:318 ./cli/app/move.go:34 ./cli/app/ps.go:205 ./cli/app/secret.go:553 ./cli/app/secret.go:649 ./cli/recipe/list.go:104 ./cli/recipe/upgrade.go:376 ./cli/recipe/version.go:139 ./cli/run.go:128 ./cli/server/list.go:106 ./cli/updater/updater.go:560
|
||||||
msgid "m"
|
msgid "m"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -3293,6 +3444,11 @@ msgstr ""
|
|||||||
msgid "man [flags]"
|
msgid "man [flags]"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:202
|
||||||
|
#, c-format
|
||||||
|
msgid "migrating app config from %s to %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ./cli/internal/recipe.go:48 ./cli/internal/recipe.go:68 ./cli/internal/recipe.go:82 ./cli/recipe/release.go:655 ./cli/recipe/sync.go:285 ./cli/recipe/upgrade.go:359
|
#: ./cli/internal/recipe.go:48 ./cli/internal/recipe.go:68 ./cli/internal/recipe.go:82 ./cli/recipe/release.go:655 ./cli/recipe/sync.go:285 ./cli/recipe/upgrade.go:359
|
||||||
msgid "minor"
|
msgid "minor"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -3322,6 +3478,16 @@ msgstr ""
|
|||||||
msgid "missing version for secret? (%s)"
|
msgid "missing version for secret? (%s)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#. translators: `app move` command
|
||||||
|
#: ./cli/app/move.go:38
|
||||||
|
msgid "move <domain> <server> [flags]"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:138
|
||||||
|
#, c-format
|
||||||
|
msgid "moving volume %s from %s to %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ./cli/app/secret.go:292
|
#: ./cli/app/secret.go:292
|
||||||
msgid "must provide <data> argument if --no-input is passed"
|
msgid "must provide <data> argument if --no-input is passed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -3527,6 +3693,10 @@ msgstr ""
|
|||||||
msgid "no server provided"
|
msgid "no server provided"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:81
|
||||||
|
msgid "no server provided?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ./cli/app/cmd.go:174
|
#: ./cli/app/cmd.go:174
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "no service %s for %s?"
|
msgid "no service %s for %s?"
|
||||||
@ -3588,7 +3758,7 @@ msgstr ""
|
|||||||
msgid "no-tty"
|
msgid "no-tty"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ./cli/internal/deploy.go:159
|
#: ./cli/internal/deploy.go:222
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "not enough arguments: %s"
|
msgid "not enough arguments: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -3761,6 +3931,10 @@ msgstr ""
|
|||||||
msgid "print machine-readable output"
|
msgid "print machine-readable output"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/internal/deploy.go:196
|
||||||
|
msgid "proceed?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ./pkg/recipe/git.go:398
|
#: ./pkg/recipe/git.go:398
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "processing %s for %s"
|
msgid "processing %s for %s"
|
||||||
@ -3808,7 +3982,7 @@ msgstr ""
|
|||||||
#. with no spaces in between
|
#. with no spaces in between
|
||||||
#. translators: `abra recipe` aliases. use a comma separated list of aliases
|
#. translators: `abra recipe` aliases. use a comma separated list of aliases
|
||||||
#. with no spaces in between
|
#. with no spaces in between
|
||||||
#: ./cli/app/backup.go:327 ./cli/app/list.go:303 ./cli/app/run.go:23 ./cli/app/upgrade.go:463 ./cli/catalogue/catalogue.go:302 ./cli/recipe/recipe.go:12 ./cli/recipe/release.go:640 ./cli/recipe/sync.go:270
|
#: ./cli/app/backup.go:327 ./cli/app/list.go:303 ./cli/app/move.go:348 ./cli/app/run.go:23 ./cli/app/upgrade.go:463 ./cli/catalogue/catalogue.go:302 ./cli/recipe/recipe.go:12 ./cli/recipe/release.go:640 ./cli/recipe/sync.go:270
|
||||||
msgid "r"
|
msgid "r"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -3988,6 +4162,16 @@ msgstr ""
|
|||||||
msgid "removed freshly created tag %s"
|
msgid "removed freshly created tag %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:182 ./cli/app/move.go:188
|
||||||
|
#, c-format
|
||||||
|
msgid "removing %s from %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:194
|
||||||
|
#, c-format
|
||||||
|
msgid "removing %s from local machine"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ./cli/server/prune.go:64
|
#: ./cli/server/prune.go:64
|
||||||
msgid "removing all images, not only dangling ones"
|
msgid "removing all images, not only dangling ones"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -4045,7 +4229,7 @@ msgstr ""
|
|||||||
msgid "repo set config: %s"
|
msgid "repo set config: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ./cli/catalogue/catalogue.go:304 ./cli/recipe/release.go:642 ./cli/recipe/sync.go:272
|
#: ./cli/app/move.go:350 ./cli/catalogue/catalogue.go:304 ./cli/recipe/release.go:642 ./cli/recipe/sync.go:272
|
||||||
msgid "report changes that would be made"
|
msgid "report changes that would be made"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -4186,6 +4370,16 @@ msgstr ""
|
|||||||
msgid "rs"
|
msgid "rs"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:168
|
||||||
|
#, c-format
|
||||||
|
msgid "rsyncing %s (renaming to %s) to %s from local machine"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:161
|
||||||
|
#, c-format
|
||||||
|
msgid "rsyncing %s from %s to local machine"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ./cli/recipe/lint.go:41
|
#: ./cli/recipe/lint.go:41
|
||||||
msgid "rule"
|
msgid "rule"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -4213,7 +4407,7 @@ msgstr ""
|
|||||||
msgid "running backup %s on %s with exec config %v"
|
msgid "running backup %s on %s with exec config %v"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ./cli/internal/deploy.go:189
|
#: ./cli/internal/deploy.go:252
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "running command %s %s within the context of %s_%s"
|
msgid "running command %s %s within the context of %s_%s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -4233,7 +4427,7 @@ msgstr ""
|
|||||||
msgid "running command: %s"
|
msgid "running command: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ./cli/internal/deploy.go:167
|
#: ./cli/internal/deploy.go:230
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "running post-command '%s %s' in container %s"
|
msgid "running post-command '%s %s' in container %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -4444,6 +4638,11 @@ msgstr ""
|
|||||||
msgid "skipped"
|
msgid "skipped"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:280
|
||||||
|
#, c-format
|
||||||
|
msgid "skipping %s as it does not match %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ./pkg/lint/recipe.go:55
|
#: ./pkg/lint/recipe.go:55
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "skipping %s based on skip condition"
|
msgid "skipping %s based on skip condition"
|
||||||
@ -4588,12 +4787,12 @@ msgstr ""
|
|||||||
msgid "successfully created %s"
|
msgid "successfully created %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ./pkg/client/client.go:97
|
#: ./pkg/client/client.go:104
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "swarm mode not enabled on %s?"
|
msgid "swarm mode not enabled on %s?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ./pkg/client/client.go:100
|
#: ./pkg/client/client.go:107
|
||||||
msgid "swarm mode not enabled on local server?"
|
msgid "swarm mode not enabled on local server?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -4814,6 +5013,11 @@ msgstr ""
|
|||||||
msgid "unable to fetch tags in %s: %s"
|
msgid "unable to fetch tags in %s: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:299
|
||||||
|
#, c-format
|
||||||
|
msgid "unable to get container matching %s: %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ./pkg/recipe/git.go:274
|
#: ./pkg/recipe/git.go:274
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "unable to git pull in %s: %s"
|
msgid "unable to git pull in %s: %s"
|
||||||
@ -4893,6 +5097,11 @@ msgstr ""
|
|||||||
msgid "unable to read version for %s from synced label. Did you try running \"abra recipe sync %s\" already?"
|
msgid "unable to read version for %s from synced label. Did you try running \"abra recipe sync %s\" already?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:208
|
||||||
|
#, c-format
|
||||||
|
msgid "unable to remove %s: %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ./cli/recipe/fetch.go:81
|
#: ./cli/recipe/fetch.go:81
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "unable to remove default remote in %s: %s"
|
msgid "unable to remove default remote in %s: %s"
|
||||||
@ -4918,6 +5127,11 @@ msgstr ""
|
|||||||
msgid "unable to resolve IPv4 for %s"
|
msgid "unable to resolve IPv4 for %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:105
|
||||||
|
#, c-format
|
||||||
|
msgid "unable to retrieve %s resources on %s: %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ./cli/app/list.go:159
|
#: ./cli/app/list.go:159
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "unable to retrieve tags for %s: %s"
|
msgid "unable to retrieve tags for %s: %s"
|
||||||
@ -4977,6 +5191,11 @@ msgstr ""
|
|||||||
msgid "undeploy succeeded 🟢"
|
msgid "undeploy succeeded 🟢"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ./cli/app/move.go:113
|
||||||
|
#, c-format
|
||||||
|
msgid "undeploying %s on %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ./pkg/upstream/stack/loader.go:108
|
#: ./pkg/upstream/stack/loader.go:108
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "unexpected environment %q"
|
msgid "unexpected environment %q"
|
||||||
|
@ -2,7 +2,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: \n"
|
"Project-Id-Version: \n"
|
||||||
"Report-Msgid-Bugs-To: EMAIL\n"
|
"Report-Msgid-Bugs-To: EMAIL\n"
|
||||||
"POT-Creation-Date: 2025-08-30 12:43+0200\n"
|
"POT-Creation-Date: 2025-09-01 11:17+0200\n"
|
||||||
"PO-Revision-Date: 2025-08-29 21:45+0000\n"
|
"PO-Revision-Date: 2025-08-29 21:45+0000\n"
|
||||||
"Last-Translator: chasqui <chasqui@cryptolab.net>\n"
|
"Last-Translator: chasqui <chasqui@cryptolab.net>\n"
|
||||||
"Language-Team: Spanish <https://translate.coopcloud.tech/projects/co-op-"
|
"Language-Team: Spanish <https://translate.coopcloud.tech/projects/co-op-"
|
||||||
@ -80,6 +80,12 @@ msgid ""
|
|||||||
" abra app ls -r gitea"
|
" abra app ls -r gitea"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/app/move.go:60
|
||||||
|
msgid ""
|
||||||
|
" # move an app\n"
|
||||||
|
" abra app move nextcloud.1312.net myserver.com"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: cli/app/cmd.go:41
|
#: cli/app/cmd.go:41
|
||||||
msgid ""
|
msgid ""
|
||||||
" # pass <cmd> args/flags without \"--\"\n"
|
" # pass <cmd> args/flags without \"--\"\n"
|
||||||
@ -231,7 +237,7 @@ msgstr ""
|
|||||||
msgid "%s does not exist for %s, use /bin/sh as fallback"
|
msgid "%s does not exist for %s, use /bin/sh as fallback"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: cli/app/cmd.go:114 cli/internal/deploy.go:151
|
#: cli/app/cmd.go:114 cli/internal/deploy.go:214
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s does not exist for %s?"
|
msgid "%s does not exist for %s?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -256,6 +262,16 @@ msgstr ""
|
|||||||
msgid "%s doesn't have a %s function"
|
msgid "%s doesn't have a %s function"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/app/move.go:158 cli/app/move.go:318
|
||||||
|
#, c-format
|
||||||
|
msgid "%s failed on %s: output:%s err:%s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/app/move.go:178
|
||||||
|
#, c-format
|
||||||
|
msgid "%s failed to extract %s on %s: output:%s err:%s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pkg/upstream/stack/stack.go:169
|
#: pkg/upstream/stack/stack.go:169
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s has been detected as deployed: %v"
|
msgid "%s has been detected as deployed: %v"
|
||||||
@ -365,6 +381,11 @@ msgstr ""
|
|||||||
msgid "%s missing from %s.env"
|
msgid "%s missing from %s.env"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/app/move.go:100
|
||||||
|
#, c-format
|
||||||
|
msgid "%s must first be deployed on %s before moving"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: cli/recipe/upgrade.go:151
|
#: cli/recipe/upgrade.go:151
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s not considered semver-like"
|
msgid "%s not considered semver-like"
|
||||||
@ -422,6 +443,11 @@ msgstr ""
|
|||||||
msgid "%s successfully stored on server"
|
msgid "%s successfully stored on server"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/app/move.go:211
|
||||||
|
#, c-format
|
||||||
|
msgid "%s was successfully moved from %s to %s 🎉"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: cli/recipe/new.go:60
|
#: cli/recipe/new.go:60
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s/example.git"
|
msgid "%s/example.git"
|
||||||
@ -764,7 +790,7 @@ msgstr ""
|
|||||||
msgid "DEPLOYED LABELS"
|
msgid "DEPLOYED LABELS"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: cli/app/list.go:222 cli/internal/deploy.go:75
|
#: cli/app/list.go:222 cli/internal/deploy.go:75 cli/internal/deploy.go:173
|
||||||
msgid "DOMAIN"
|
msgid "DOMAIN"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -993,6 +1019,10 @@ msgstr "📋 Listar los contenidos de una captura o instantánea 📸"
|
|||||||
msgid "List volumes associated with an app"
|
msgid "List volumes associated with an app"
|
||||||
msgstr "📋 Listar volúmenes 📦 asociados a una plataforma 🚀"
|
msgstr "📋 Listar volúmenes 📦 asociados a una plataforma 🚀"
|
||||||
|
|
||||||
|
#: cli/internal/deploy.go:181
|
||||||
|
msgid "MOVE OVERVIEW"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. translators: Short description for `app backup` command group
|
#. translators: Short description for `app backup` command group
|
||||||
#: cli/app/backup.go:246
|
#: cli/app/backup.go:246
|
||||||
msgid "Manage app backups"
|
msgid "Manage app backups"
|
||||||
@ -1027,6 +1057,40 @@ msgstr "⚙️ Administrar servidores (huertas digitales) 🕋"
|
|||||||
msgid "Manage the recipe catalogue"
|
msgid "Manage the recipe catalogue"
|
||||||
msgstr "⚙️ Administrar catálogo 📋 de recetas 🧑🍳"
|
msgstr "⚙️ Administrar catálogo 📋 de recetas 🧑🍳"
|
||||||
|
|
||||||
|
#: cli/app/move.go:42
|
||||||
|
msgid ""
|
||||||
|
"Move an app to a differnt server.\n"
|
||||||
|
"\n"
|
||||||
|
"This command will migrate an app config and copy secrets and volumes from "
|
||||||
|
"the\n"
|
||||||
|
"old server to the new one. The app MUST be deployed on the old server "
|
||||||
|
"before\n"
|
||||||
|
"doing the move. The app will be undeployed from the current server but not\n"
|
||||||
|
"deployed on the new server.\n"
|
||||||
|
"\n"
|
||||||
|
"This command requires the \"cat\" command to be present on the app "
|
||||||
|
"containers\n"
|
||||||
|
"when retrieving secrets. Some \"distroless\" images will not support this. "
|
||||||
|
"Not\n"
|
||||||
|
"all apps are therefore moveable. Rsync is required on your local machine "
|
||||||
|
"for\n"
|
||||||
|
"transferring volumes.\n"
|
||||||
|
"\n"
|
||||||
|
"Do not forget to update your DNS records. Don't panic, it might take a "
|
||||||
|
"while\n"
|
||||||
|
"for the dust to settle after you move an app. If anything goes wrong, you "
|
||||||
|
"can\n"
|
||||||
|
"always move the app config file to the original server and deploy it there\n"
|
||||||
|
"again. No data is removed from the old server.\n"
|
||||||
|
"\n"
|
||||||
|
"Use \"--dry-run/-r\" to see which secrets and volumes will be moved."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. translators: Short description for `app move` command
|
||||||
|
#: cli/app/move.go:41
|
||||||
|
msgid "Moves an app to a different server"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: cli/recipe/new.go:123
|
#: cli/recipe/new.go:123
|
||||||
msgid "N"
|
msgid "N"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -1044,6 +1108,10 @@ msgstr ""
|
|||||||
msgid "NEW DEPLOYMENT"
|
msgid "NEW DEPLOYMENT"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/internal/deploy.go:176
|
||||||
|
msgid "NEW SERVER"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: cli/app/secret.go:147
|
#: cli/app/secret.go:147
|
||||||
msgid "NOT"
|
msgid "NOT"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -1061,6 +1129,10 @@ msgid ""
|
|||||||
"Use \"--major/-m\" to include new major versions."
|
"Use \"--major/-m\" to include new major versions."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/internal/deploy.go:175
|
||||||
|
msgid "OLD SERVER"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: cli/app/volume.go:54
|
#: cli/app/volume.go:54
|
||||||
msgid "ON SERVER"
|
msgid "ON SERVER"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -1087,7 +1159,7 @@ msgstr ""
|
|||||||
msgid "README.md metadata filled in"
|
msgid "README.md metadata filled in"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: cli/app/list.go:222 cli/internal/deploy.go:76
|
#: cli/app/list.go:222 cli/internal/deploy.go:76 cli/internal/deploy.go:174
|
||||||
msgid "RECIPE"
|
msgid "RECIPE"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -1227,6 +1299,10 @@ msgstr "💻 Ejecutar comandos en una plataforma 🚀"
|
|||||||
msgid "S"
|
msgid "S"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/internal/deploy.go:177
|
||||||
|
msgid "SECRETS"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: cli/app/new.go:204
|
#: cli/app/new.go:204
|
||||||
msgid "SECRETS OVERVIEW"
|
msgid "SECRETS OVERVIEW"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -1618,6 +1694,10 @@ msgstr ""
|
|||||||
msgid "VERSION"
|
msgid "VERSION"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/internal/deploy.go:178
|
||||||
|
msgid "VOLUMES"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: cli/recipe/reset.go:24
|
#: cli/recipe/reset.go:24
|
||||||
msgid "WARNING: this will delete your changes. Be Careful."
|
msgid "WARNING: this will delete your changes. Be Careful."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -1919,6 +1999,11 @@ msgstr ""
|
|||||||
msgid "bad status: %s"
|
msgid "bad status: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/app/move.go:110
|
||||||
|
#, c-format
|
||||||
|
msgid "bailing out: %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pkg/upstream/convert/volume.go:113
|
#: pkg/upstream/convert/volume.go:113
|
||||||
msgid "bind options are incompatible with type tmpfs"
|
msgid "bind options are incompatible with type tmpfs"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -1974,6 +2059,10 @@ msgstr ""
|
|||||||
msgid "can't separate key from value: %s (this variable is probably unset)"
|
msgid "can't separate key from value: %s (this variable is probably unset)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/internal/deploy.go:202
|
||||||
|
msgid "cancelled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pkg/catalogue/catalogue.go:59 pkg/recipe/git.go:245
|
#: pkg/catalogue/catalogue.go:59 pkg/recipe/git.go:245
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "cannot ensure %s is up-to-date, no git remotes configured"
|
msgid "cannot ensure %s is up-to-date, no git remotes configured"
|
||||||
@ -2315,11 +2404,16 @@ msgstr ""
|
|||||||
msgid "create remote directory: %s"
|
msgid "create remote directory: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pkg/client/client.go:88
|
#: pkg/client/client.go:95
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "created client for %s"
|
msgid "created client for %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/app/move.go:134
|
||||||
|
#, fuzzy, c-format
|
||||||
|
msgid "created secret on %s: %s"
|
||||||
|
msgstr "🥷 Genera secretos (contraseñas) automáticamente 🤖"
|
||||||
|
|
||||||
#: cli/recipe/release.go:428
|
#: cli/recipe/release.go:428
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "created tag %s at %s"
|
msgid "created tag %s at %s"
|
||||||
@ -2335,6 +2429,11 @@ msgstr ""
|
|||||||
msgid "creating %s"
|
msgid "creating %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/app/move.go:154
|
||||||
|
#, c-format
|
||||||
|
msgid "creating %s on %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: cli/server/add.go:175
|
#: cli/server/add.go:175
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "creating context with domain %s"
|
msgid "creating context with domain %s"
|
||||||
@ -2350,6 +2449,11 @@ msgstr ""
|
|||||||
msgid "creating secret %s"
|
msgid "creating secret %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/app/move.go:144
|
||||||
|
#, c-format
|
||||||
|
msgid "creating volume %s on %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pkg/lint/recipe.go:22
|
#: pkg/lint/recipe.go:22
|
||||||
msgid "critical"
|
msgid "critical"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -2553,6 +2657,10 @@ msgstr ""
|
|||||||
msgid "download <domain> [flags]"
|
msgid "download <domain> [flags]"
|
||||||
msgstr "descargar <domain> [flags]"
|
msgstr "descargar <domain> [flags]"
|
||||||
|
|
||||||
|
#: cli/internal/deploy.go:192
|
||||||
|
msgid "dry run"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pkg/git/add.go:22
|
#: pkg/git/add.go:22
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "dry run: adding %s"
|
msgid "dry run: adding %s"
|
||||||
@ -2595,7 +2703,7 @@ msgstr ""
|
|||||||
msgid "dry run: remote %s (%s) not created"
|
msgid "dry run: remote %s (%s) not created"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: cli/catalogue/catalogue.go:301 cli/recipe/release.go:639
|
#: cli/app/move.go:347 cli/catalogue/catalogue.go:301 cli/recipe/release.go:639
|
||||||
#: cli/recipe/sync.go:269
|
#: cli/recipe/sync.go:269
|
||||||
msgid "dry-run"
|
msgid "dry-run"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -2722,6 +2830,16 @@ msgstr ""
|
|||||||
msgid "expected 1 service but found %v: %s"
|
msgid "expected 1 service but found %v: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/app/move.go:174
|
||||||
|
#, c-format
|
||||||
|
msgid "extracting %s on %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/app/move.go:313
|
||||||
|
#, c-format
|
||||||
|
msgid "extracting secret %s on %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. translators: `abra recipe fetch` aliases. use a comma separated list of aliases
|
#. translators: `abra recipe fetch` aliases. use a comma separated list of aliases
|
||||||
#. with no spaces in between
|
#. with no spaces in between
|
||||||
#: cli/app/deploy.go:347 cli/app/remove.go:163 cli/app/rollback.go:329
|
#: cli/app/deploy.go:347 cli/app/remove.go:163 cli/app/rollback.go:329
|
||||||
@ -2750,6 +2868,16 @@ msgstr ""
|
|||||||
msgid "failed to commit changes: %s"
|
msgid "failed to commit changes: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/app/move.go:164
|
||||||
|
#, c-format
|
||||||
|
msgid "failed to copy %s from %s to local machine: output:%s err:%s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/app/move.go:171
|
||||||
|
#, c-format
|
||||||
|
msgid "failed to copy %s from local machine to %s: output:%s err:%s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pkg/upstream/stack/stack.go:531
|
#: pkg/upstream/stack/stack.go:531
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "failed to create %s"
|
msgid "failed to create %s"
|
||||||
@ -2770,6 +2898,11 @@ msgstr ""
|
|||||||
msgid "failed to create secret %s"
|
msgid "failed to create secret %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/app/move.go:150
|
||||||
|
#, fuzzy, c-format
|
||||||
|
msgid "failed to create volume %s on %s: %s"
|
||||||
|
msgstr "🥷 Genera secretos (contraseñas) automáticamente 🤖"
|
||||||
|
|
||||||
#: cli/updater/updater.go:263
|
#: cli/updater/updater.go:263
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "failed to determine deployed version of %s"
|
msgid "failed to determine deployed version of %s"
|
||||||
@ -2798,6 +2931,11 @@ msgstr ""
|
|||||||
msgid "failed to match chosen service"
|
msgid "failed to match chosen service"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/app/move.go:204
|
||||||
|
#, c-format
|
||||||
|
msgid "failed to migrate app config: %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pkg/client/registry.go:20
|
#: pkg/client/registry.go:20
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "failed to parse image %s, saw: %s"
|
msgid "failed to parse image %s, saw: %s"
|
||||||
@ -2808,6 +2946,21 @@ msgstr ""
|
|||||||
msgid "failed to publish new release: %s"
|
msgid "failed to publish new release: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/app/move.go:185 cli/app/move.go:191
|
||||||
|
#, c-format
|
||||||
|
msgid "failed to remove %s from %s: output:%s err:%s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/app/move.go:197
|
||||||
|
#, c-format
|
||||||
|
msgid "failed to remove %s on local machine: output:%s err:%s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/app/move.go:119
|
||||||
|
#, c-format
|
||||||
|
msgid "failed to remove app from %s: %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pkg/upstream/stack/remove.go:183
|
#: pkg/upstream/stack/remove.go:183
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "failed to remove config %s: %s"
|
msgid "failed to remove config %s: %s"
|
||||||
@ -2852,6 +3005,11 @@ msgstr ""
|
|||||||
msgid "failed to select default branch in %s"
|
msgid "failed to select default branch in %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/app/move.go:132
|
||||||
|
#, fuzzy, c-format
|
||||||
|
msgid "failed to store secret on %s: %s"
|
||||||
|
msgstr "🥷 Genera secretos (contraseñas) automáticamente 🤖"
|
||||||
|
|
||||||
#: cli/recipe/release.go:269 cli/recipe/release.go:554
|
#: cli/recipe/release.go:269 cli/recipe/release.go:554
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "failed to tag release: %s"
|
msgid "failed to tag release: %s"
|
||||||
@ -3458,12 +3616,14 @@ msgstr ""
|
|||||||
msgid "ls"
|
msgid "ls"
|
||||||
msgstr "plataformas"
|
msgstr "plataformas"
|
||||||
|
|
||||||
|
#. translators: `abra app move` aliases. use a comma separated list of aliases
|
||||||
|
#. with no spaces in between
|
||||||
#. translators: `abra man` aliases. use a comma separated list of aliases
|
#. translators: `abra man` aliases. use a comma separated list of aliases
|
||||||
#. with no spaces in between
|
#. with no spaces in between
|
||||||
#: cli/app/list.go:318 cli/app/ps.go:205 cli/app/secret.go:553
|
#: cli/app/list.go:318 cli/app/move.go:34 cli/app/ps.go:205
|
||||||
#: cli/app/secret.go:649 cli/recipe/list.go:104 cli/recipe/upgrade.go:376
|
#: cli/app/secret.go:553 cli/app/secret.go:649 cli/recipe/list.go:104
|
||||||
#: cli/recipe/version.go:139 cli/run.go:128 cli/server/list.go:106
|
#: cli/recipe/upgrade.go:376 cli/recipe/version.go:139 cli/run.go:128
|
||||||
#: cli/updater/updater.go:560
|
#: cli/server/list.go:106 cli/updater/updater.go:560
|
||||||
msgid "m"
|
msgid "m"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -3499,6 +3659,11 @@ msgstr ""
|
|||||||
msgid "man [flags]"
|
msgid "man [flags]"
|
||||||
msgstr "manual [flags]"
|
msgstr "manual [flags]"
|
||||||
|
|
||||||
|
#: cli/app/move.go:202
|
||||||
|
#, c-format
|
||||||
|
msgid "migrating app config from %s to %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: cli/internal/recipe.go:48 cli/internal/recipe.go:68
|
#: cli/internal/recipe.go:48 cli/internal/recipe.go:68
|
||||||
#: cli/internal/recipe.go:82 cli/recipe/release.go:655 cli/recipe/sync.go:285
|
#: cli/internal/recipe.go:82 cli/recipe/release.go:655 cli/recipe/sync.go:285
|
||||||
#: cli/recipe/upgrade.go:359
|
#: cli/recipe/upgrade.go:359
|
||||||
@ -3530,6 +3695,17 @@ msgstr ""
|
|||||||
msgid "missing version for secret? (%s)"
|
msgid "missing version for secret? (%s)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#. translators: `app move` command
|
||||||
|
#: cli/app/move.go:38
|
||||||
|
#, fuzzy
|
||||||
|
msgid "move <domain> <server> [flags]"
|
||||||
|
msgstr "borrar <domain> [flags]"
|
||||||
|
|
||||||
|
#: cli/app/move.go:138
|
||||||
|
#, c-format
|
||||||
|
msgid "moving volume %s from %s to %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: cli/app/secret.go:292
|
#: cli/app/secret.go:292
|
||||||
msgid "must provide <data> argument if --no-input is passed"
|
msgid "must provide <data> argument if --no-input is passed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -3743,6 +3919,10 @@ msgstr ""
|
|||||||
msgid "no server provided"
|
msgid "no server provided"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/app/move.go:81
|
||||||
|
msgid "no server provided?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: cli/app/cmd.go:174
|
#: cli/app/cmd.go:174
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "no service %s for %s?"
|
msgid "no service %s for %s?"
|
||||||
@ -3806,7 +3986,7 @@ msgstr ""
|
|||||||
msgid "no-tty"
|
msgid "no-tty"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: cli/internal/deploy.go:159
|
#: cli/internal/deploy.go:222
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "not enough arguments: %s"
|
msgid "not enough arguments: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -3973,8 +4153,9 @@ msgid "polling deployment status"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pkg/upstream/stack/remove.go:87
|
#: pkg/upstream/stack/remove.go:87
|
||||||
|
#, fuzzy
|
||||||
msgid "polling undeploy status"
|
msgid "polling undeploy status"
|
||||||
msgstr ""
|
msgstr "📋 Revisar el estado de una plataforma"
|
||||||
|
|
||||||
#: cli/run.go:185
|
#: cli/run.go:185
|
||||||
msgid "prefer offline & filesystem access"
|
msgid "prefer offline & filesystem access"
|
||||||
@ -3990,6 +4171,10 @@ msgstr ""
|
|||||||
msgid "print machine-readable output"
|
msgid "print machine-readable output"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/internal/deploy.go:196
|
||||||
|
msgid "proceed?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pkg/recipe/git.go:398
|
#: pkg/recipe/git.go:398
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "processing %s for %s"
|
msgid "processing %s for %s"
|
||||||
@ -4037,8 +4222,8 @@ msgstr ""
|
|||||||
#. with no spaces in between
|
#. with no spaces in between
|
||||||
#. translators: `abra recipe` aliases. use a comma separated list of aliases
|
#. translators: `abra recipe` aliases. use a comma separated list of aliases
|
||||||
#. with no spaces in between
|
#. with no spaces in between
|
||||||
#: cli/app/backup.go:327 cli/app/list.go:303 cli/app/run.go:23
|
#: cli/app/backup.go:327 cli/app/list.go:303 cli/app/move.go:348
|
||||||
#: cli/app/upgrade.go:463 cli/catalogue/catalogue.go:302
|
#: cli/app/run.go:23 cli/app/upgrade.go:463 cli/catalogue/catalogue.go:302
|
||||||
#: cli/recipe/recipe.go:12 cli/recipe/release.go:640 cli/recipe/sync.go:270
|
#: cli/recipe/recipe.go:12 cli/recipe/release.go:640 cli/recipe/sync.go:270
|
||||||
msgid "r"
|
msgid "r"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -4221,6 +4406,16 @@ msgstr ""
|
|||||||
msgid "removed freshly created tag %s"
|
msgid "removed freshly created tag %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/app/move.go:182 cli/app/move.go:188
|
||||||
|
#, c-format
|
||||||
|
msgid "removing %s from %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/app/move.go:194
|
||||||
|
#, c-format
|
||||||
|
msgid "removing %s from local machine"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: cli/server/prune.go:64
|
#: cli/server/prune.go:64
|
||||||
msgid "removing all images, not only dangling ones"
|
msgid "removing all images, not only dangling ones"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -4278,7 +4473,7 @@ msgstr ""
|
|||||||
msgid "repo set config: %s"
|
msgid "repo set config: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: cli/catalogue/catalogue.go:304 cli/recipe/release.go:642
|
#: cli/app/move.go:350 cli/catalogue/catalogue.go:304 cli/recipe/release.go:642
|
||||||
#: cli/recipe/sync.go:272
|
#: cli/recipe/sync.go:272
|
||||||
msgid "report changes that would be made"
|
msgid "report changes that would be made"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -4421,6 +4616,16 @@ msgstr ""
|
|||||||
msgid "rs"
|
msgid "rs"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/app/move.go:168
|
||||||
|
#, c-format
|
||||||
|
msgid "rsyncing %s (renaming to %s) to %s from local machine"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/app/move.go:161
|
||||||
|
#, c-format
|
||||||
|
msgid "rsyncing %s from %s to local machine"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: cli/recipe/lint.go:41
|
#: cli/recipe/lint.go:41
|
||||||
msgid "rule"
|
msgid "rule"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -4448,7 +4653,7 @@ msgstr ""
|
|||||||
msgid "running backup %s on %s with exec config %v"
|
msgid "running backup %s on %s with exec config %v"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: cli/internal/deploy.go:189
|
#: cli/internal/deploy.go:252
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "running command %s %s within the context of %s_%s"
|
msgid "running command %s %s within the context of %s_%s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -4468,7 +4673,7 @@ msgstr ""
|
|||||||
msgid "running command: %s"
|
msgid "running command: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: cli/internal/deploy.go:167
|
#: cli/internal/deploy.go:230
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "running post-command '%s %s' in container %s"
|
msgid "running post-command '%s %s' in container %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -4686,6 +4891,11 @@ msgstr ""
|
|||||||
msgid "skipped"
|
msgid "skipped"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/app/move.go:280
|
||||||
|
#, c-format
|
||||||
|
msgid "skipping %s as it does not match %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pkg/lint/recipe.go:55
|
#: pkg/lint/recipe.go:55
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "skipping %s based on skip condition"
|
msgid "skipping %s based on skip condition"
|
||||||
@ -4832,12 +5042,12 @@ msgstr ""
|
|||||||
msgid "successfully created %s"
|
msgid "successfully created %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pkg/client/client.go:97
|
#: pkg/client/client.go:104
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "swarm mode not enabled on %s?"
|
msgid "swarm mode not enabled on %s?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pkg/client/client.go:100
|
#: pkg/client/client.go:107
|
||||||
msgid "swarm mode not enabled on local server?"
|
msgid "swarm mode not enabled on local server?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -5060,6 +5270,11 @@ msgstr ""
|
|||||||
msgid "unable to fetch tags in %s: %s"
|
msgid "unable to fetch tags in %s: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/app/move.go:299
|
||||||
|
#, c-format
|
||||||
|
msgid "unable to get container matching %s: %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pkg/recipe/git.go:274
|
#: pkg/recipe/git.go:274
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "unable to git pull in %s: %s"
|
msgid "unable to git pull in %s: %s"
|
||||||
@ -5142,6 +5357,11 @@ msgid ""
|
|||||||
"recipe sync %s\" already?"
|
"recipe sync %s\" already?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/app/move.go:208
|
||||||
|
#, c-format
|
||||||
|
msgid "unable to remove %s: %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: cli/recipe/fetch.go:81
|
#: cli/recipe/fetch.go:81
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "unable to remove default remote in %s: %s"
|
msgid "unable to remove default remote in %s: %s"
|
||||||
@ -5168,6 +5388,11 @@ msgstr ""
|
|||||||
msgid "unable to resolve IPv4 for %s"
|
msgid "unable to resolve IPv4 for %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/app/move.go:105
|
||||||
|
#, c-format
|
||||||
|
msgid "unable to retrieve %s resources on %s: %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: cli/app/list.go:159
|
#: cli/app/list.go:159
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "unable to retrieve tags for %s: %s"
|
msgid "unable to retrieve tags for %s: %s"
|
||||||
@ -5227,6 +5452,11 @@ msgstr "desarmar <domain> [flags]"
|
|||||||
msgid "undeploy succeeded 🟢"
|
msgid "undeploy succeeded 🟢"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: cli/app/move.go:113
|
||||||
|
#, c-format
|
||||||
|
msgid "undeploying %s on %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pkg/upstream/stack/loader.go:108
|
#: pkg/upstream/stack/loader.go:108
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "unexpected environment %q"
|
msgid "unexpected environment %q"
|
||||||
|
@ -218,7 +218,7 @@ func GenerateSecrets(cl *dockerClient.Client, secrets map[string]Secret, server
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := client.StoreSecret(cl, secret.RemoteName, password, server); err != nil {
|
if err := client.StoreSecret(cl, secret.RemoteName, password); err != nil {
|
||||||
if strings.Contains(err.Error(), "AlreadyExists") {
|
if strings.Contains(err.Error(), "AlreadyExists") {
|
||||||
log.Warnf(i18n.G("%s already exists", secret.RemoteName))
|
log.Warnf(i18n.G("%s already exists", secret.RemoteName))
|
||||||
ch <- nil
|
ch <- nil
|
||||||
@ -238,7 +238,7 @@ func GenerateSecrets(cl *dockerClient.Client, secrets map[string]Secret, server
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := client.StoreSecret(cl, secret.RemoteName, passphrase, server); err != nil {
|
if err := client.StoreSecret(cl, secret.RemoteName, passphrase); err != nil {
|
||||||
if strings.Contains(err.Error(), "AlreadyExists") {
|
if strings.Contains(err.Error(), "AlreadyExists") {
|
||||||
log.Warnf(i18n.G("%s already exists", secret.RemoteName))
|
log.Warnf(i18n.G("%s already exists", secret.RemoteName))
|
||||||
ch <- nil
|
ch <- nil
|
||||||
|
42
tests/integration/app_move.bats
Normal file
42
tests/integration/app_move.bats
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
setup_file(){
|
||||||
|
load "$PWD/tests/integration/helpers/common"
|
||||||
|
_common_setup
|
||||||
|
_add_server
|
||||||
|
_add_move_server
|
||||||
|
_new_app
|
||||||
|
}
|
||||||
|
|
||||||
|
teardown_file(){
|
||||||
|
_rm_app
|
||||||
|
_rm_server
|
||||||
|
_rm_move_server
|
||||||
|
}
|
||||||
|
|
||||||
|
setup(){
|
||||||
|
load "$PWD/tests/integration/helpers/common"
|
||||||
|
_common_setup
|
||||||
|
_ensure_catalogue
|
||||||
|
}
|
||||||
|
|
||||||
|
teardown(){
|
||||||
|
_undeploy_app
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "validate app argument" {
|
||||||
|
run $ABRA app move
|
||||||
|
assert_failure
|
||||||
|
|
||||||
|
run $ABRA app move DOESNTEXIST
|
||||||
|
assert_failure
|
||||||
|
|
||||||
|
run $ABRA app move "$TEST_APP_DOMAIN" DOESNTEXIST
|
||||||
|
assert_failure
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "move app fails if not deployed" {
|
||||||
|
run $ABRA app move "$TEST_APP_DOMAIN" "$TEST_MOVE_SERVER"
|
||||||
|
assert_failure
|
||||||
|
assert_output --partial 'must first be deployed'
|
||||||
|
}
|
@ -17,6 +17,7 @@ _common_setup() {
|
|||||||
|
|
||||||
export TEST_APP_NAME="$(basename "${BATS_TEST_FILENAME//./_}")"
|
export TEST_APP_NAME="$(basename "${BATS_TEST_FILENAME//./_}")"
|
||||||
export TEST_APP_DOMAIN="$TEST_APP_NAME.$TEST_SERVER"
|
export TEST_APP_DOMAIN="$TEST_APP_NAME.$TEST_SERVER"
|
||||||
|
export TEST_MOVE_SERVER="default2"
|
||||||
export TEST_RECIPE="abra-test-recipe"
|
export TEST_RECIPE="abra-test-recipe"
|
||||||
|
|
||||||
_ensure_swarm
|
_ensure_swarm
|
||||||
|
@ -10,6 +10,15 @@ _add_server() {
|
|||||||
assert_exists "$ABRA_DIR/servers/$TEST_SERVER"
|
assert_exists "$ABRA_DIR/servers/$TEST_SERVER"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_add_move_server() {
|
||||||
|
run docker context create default2 --docker "host=unix:///var/run/docker.sock"
|
||||||
|
assert_success
|
||||||
|
|
||||||
|
run mkdir -p "$ABRA_DIR/servers/default2"
|
||||||
|
assert_success
|
||||||
|
assert_exists "$ABRA_DIR/servers/default2"
|
||||||
|
}
|
||||||
|
|
||||||
_rm_server() {
|
_rm_server() {
|
||||||
if [[ "$TEST_SERVER" == "default" ]]; then
|
if [[ "$TEST_SERVER" == "default" ]]; then
|
||||||
run rm -rf "$ABRA_DIR/servers/default"
|
run rm -rf "$ABRA_DIR/servers/default"
|
||||||
@ -20,6 +29,15 @@ _rm_server() {
|
|||||||
assert_not_exists "$ABRA_DIR/servers/$TEST_SERVER"
|
assert_not_exists "$ABRA_DIR/servers/$TEST_SERVER"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_rm_move_server() {
|
||||||
|
run docker context rm default2
|
||||||
|
assert_success
|
||||||
|
|
||||||
|
run rm -rf "$ABRA_DIR/servers/default2"
|
||||||
|
assert_success
|
||||||
|
assert_not_exists "$ABRA_DIR/servers/default2"
|
||||||
|
}
|
||||||
|
|
||||||
_rm_default_server(){
|
_rm_default_server(){
|
||||||
run rm -rf "$ABRA_DIR/servers/default"
|
run rm -rf "$ABRA_DIR/servers/default"
|
||||||
assert_success
|
assert_success
|
||||||
|
Reference in New Issue
Block a user