Compare commits

...

12 Commits

9 changed files with 49 additions and 33 deletions

View File

@ -31,7 +31,7 @@ func stackLogs(c *cli.Context, stackName string, client *dockerClient.Client) {
wg.Add(1) wg.Add(1)
go func(s string) { go func(s string) {
logOpts := types.ContainerLogsOptions{ logOpts := types.ContainerLogsOptions{
Details: true, Details: false,
Follow: true, Follow: true,
ShowStderr: true, ShowStderr: true,
ShowStdout: true, ShowStdout: true,
@ -88,7 +88,7 @@ var appLogsCommand = &cli.Command{
} }
logOpts := types.ContainerLogsOptions{ logOpts := types.ContainerLogsOptions{
Details: true, Details: false,
Follow: true, Follow: true,
ShowStderr: true, ShowStderr: true,
ShowStdout: true, ShowStdout: true,

View File

@ -7,6 +7,7 @@ import (
"coopcloud.tech/abra/cli/internal" "coopcloud.tech/abra/cli/internal"
"coopcloud.tech/abra/pkg/client" "coopcloud.tech/abra/pkg/client"
"coopcloud.tech/abra/pkg/config" "coopcloud.tech/abra/pkg/config"
stack "coopcloud.tech/abra/pkg/upstream/stack"
"github.com/AlecAivazis/survey/v2" "github.com/AlecAivazis/survey/v2"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/filters"
@ -48,23 +49,18 @@ var appRemoveCommand = &cli.Command{
} }
} }
appFiles, err := config.LoadAppFiles("")
if err != nil {
logrus.Fatal(err)
}
cl, err := client.New(app.Server) cl, err := client.New(app.Server)
if err != nil { if err != nil {
logrus.Fatal(err) logrus.Fatal(err)
} }
if !internal.Force { if !internal.Force {
// FIXME: only query for app we are interested in, not all of them! isDeployed, _, err := stack.IsDeployed(c.Context, cl, app.StackName())
statuses, err := config.GetAppStatuses(appFiles)
if err != nil { if err != nil {
logrus.Fatal(err) logrus.Fatal(err)
} }
if statuses[app.Name]["status"] == "deployed" { if isDeployed {
logrus.Fatalf("'%s' is still deployed. Run \"abra app %s undeploy\" or pass --force", app.Name, app.Name) logrus.Fatalf("'%s' is still deployed. Run \"abra app undeploy %s \" or pass --force", app.Name, app.Name)
} }
} }

View File

@ -40,12 +40,14 @@ var CatalogueSkipList = map[string]bool{
"docker-cp-deploy": true, "docker-cp-deploy": true,
"docker-dind-bats-kcov": true, "docker-dind-bats-kcov": true,
"docs.coopcloud.tech": true, "docs.coopcloud.tech": true,
"drone-abra": true,
"example": true, "example": true,
"gardening": true, "gardening": true,
"go-abra": true, "go-abra": true,
"organising": true, "organising": true,
"pyabra": true, "pyabra": true,
"radicle-seed-node": true, "radicle-seed-node": true,
"recipes": true,
"stack-ssh-deploy": true, "stack-ssh-deploy": true,
"swarm-cronjob": true, "swarm-cronjob": true,
"tagcmp": true, "tagcmp": true,
@ -176,7 +178,7 @@ A new catalogue copy can be published to the recipes repository by passing the
features, category, err := catalogue.GetRecipeFeaturesAndCategory(recipeMeta.Name) features, category, err := catalogue.GetRecipeFeaturesAndCategory(recipeMeta.Name)
if err != nil { if err != nil {
logrus.Fatal(err) logrus.Warn(err)
} }
catl[recipeMeta.Name] = catalogue.RecipeMeta{ catl[recipeMeta.Name] = catalogue.RecipeMeta{

View File

@ -26,7 +26,7 @@ func DeployAction(c *cli.Context) error {
logrus.Fatal(err) logrus.Fatal(err)
} }
logrus.Debugf("checking whether '%s' is already deployed", stackName) logrus.Debugf("checking whether %s is already deployed", stackName)
isDeployed, deployedVersion, err := stack.IsDeployed(c.Context, cl, stackName) isDeployed, deployedVersion, err := stack.IsDeployed(c.Context, cl, stackName)
if err != nil { if err != nil {
@ -35,9 +35,9 @@ func DeployAction(c *cli.Context) error {
if isDeployed { if isDeployed {
if Force || Chaos { if Force || Chaos {
logrus.Warnf("'%s' is already deployed but continuing (--force/--chaos)", stackName) logrus.Warnf("%s is already deployed but continuing (--force/--chaos)", stackName)
} else { } else {
logrus.Fatalf("'%s' is already deployed", stackName) logrus.Fatalf("%s is already deployed", stackName)
} }
} }
@ -53,7 +53,7 @@ func DeployAction(c *cli.Context) error {
} }
if len(versions) > 0 { if len(versions) > 0 {
version = versions[len(versions)-1] version = versions[len(versions)-1]
logrus.Debugf("choosing '%s' as version to deploy", version) logrus.Debugf("choosing %s as version to deploy", version)
if err := recipe.EnsureVersion(app.Type, version); err != nil { if err := recipe.EnsureVersion(app.Type, version); err != nil {
logrus.Fatal(err) logrus.Fatal(err)
} }
@ -67,7 +67,7 @@ func DeployAction(c *cli.Context) error {
} }
if version == "" && !Chaos { if version == "" && !Chaos {
logrus.Debugf("choosing '%s' as version to deploy", version) logrus.Debugf("choosing %s as version to deploy", version)
if err := recipe.EnsureVersion(app.Type, version); err != nil { if err := recipe.EnsureVersion(app.Type, version); err != nil {
logrus.Fatal(err) logrus.Fatal(err)
} }

View File

@ -236,7 +236,7 @@ func installDocker(c *cli.Context, cl *dockerClient.Client, sshCl *ssh.Client, d
} }
} }
logrus.Infof("docker is installed on %s", domainName) logrus.Infof("docker is already installed on %s", domainName)
return nil return nil
} }
@ -276,7 +276,8 @@ func initSwarm(c *cli.Context, cl *dockerClient.Client, domainName string) error
AdvertiseAddr: ipv4, AdvertiseAddr: ipv4,
} }
if _, err := cl.SwarmInit(c.Context, initReq); err != nil { if _, err := cl.SwarmInit(c.Context, initReq); err != nil {
if !strings.Contains(err.Error(), "is already part of a swarm") { if !strings.Contains(err.Error(), "is already part of a swarm") ||
!strings.Contains(err.Error(), "must specify a listening address") {
return err return err
} }
logrus.Infof("swarm mode already initialised on %s", domainName) logrus.Infof("swarm mode already initialised on %s", domainName)

View File

@ -411,7 +411,7 @@ func GetImageMetadata(imageRowString string) (image, error) {
if err != nil { if err != nil {
logrus.Fatal(err) logrus.Fatal(err)
} }
img.Image = imageName img.Image = strings.ReplaceAll(imageName, "`", "")
imageURL, err := GetStringInBetween(imgString, "(", ")") imageURL, err := GetStringInBetween(imgString, "(", ")")
if err != nil { if err != nil {
@ -441,7 +441,7 @@ func GetRecipeFeaturesAndCategory(recipeName string) (features, string, error) {
"<!-- metadata -->", "<!-- endmetadata -->", "<!-- metadata -->", "<!-- endmetadata -->",
) )
if err != nil { if err != nil {
logrus.Fatal(err) return feat, category, err
} }
readmeLines := strings.Split( // Array item from lines readmeLines := strings.Split( // Array item from lines
@ -553,9 +553,21 @@ func GetRecipeVersions(recipeName string) (RecipeVersions, error) {
path = strings.Split(path, "/")[1] path = strings.Split(path, "/")[1]
} }
var tag string
switch img.(type) {
case reference.NamedTagged:
tag = img.(reference.NamedTagged).Tag()
case reference.Named:
logrus.Warnf("%s service is missing image tag?", path)
continue
}
logrus.Debugf("looking up image: '%s' from '%s'", img, path)
digest, err := client.GetTagDigest(img) digest, err := client.GetTagDigest(img)
if err != nil { if err != nil {
return err logrus.Warn(err)
continue
} }
versionMeta[service.Name] = ServiceMeta{ versionMeta[service.Name] = ServiceMeta{

View File

@ -157,7 +157,8 @@ func EnsureVersion(recipeName, version string) error {
logrus.Debugf("read '%s' as tags for recipe '%s'", strings.Join(parsedTags, ", "), recipeName) logrus.Debugf("read '%s' as tags for recipe '%s'", strings.Join(parsedTags, ", "), recipeName)
if tagRef.String() == "" { if tagRef.String() == "" {
return fmt.Errorf("%s is not available?", version) logrus.Warnf("%s recipe has no local tag: %s? this recipe version is not released?", recipeName, version)
return nil
} }
worktree, err := repo.Worktree() worktree, err := repo.Worktree()

View File

@ -350,7 +350,7 @@ func deployServices(
existingServiceMap[service.Spec.Name] = service existingServiceMap[service.Spec.Name] = service
} }
var serviceIDs []string serviceIDs := make(map[string]string)
for internalName, serviceSpec := range services { for internalName, serviceSpec := range services {
var ( var (
name = namespace.Scope(internalName) name = namespace.Scope(internalName)
@ -410,7 +410,7 @@ func deployServices(
return errors.Wrapf(err, "failed to update service %s", name) return errors.Wrapf(err, "failed to update service %s", name)
} }
serviceIDs = append(serviceIDs, service.ID) serviceIDs[service.ID] = name
for _, warning := range response.Warnings { for _, warning := range response.Warnings {
logrus.Warn(warning) logrus.Warn(warning)
@ -430,15 +430,19 @@ func deployServices(
return errors.Wrapf(err, "failed to create service %s", name) return errors.Wrapf(err, "failed to create service %s", name)
} }
serviceIDs = append(serviceIDs, serviceCreateResponse.ID) serviceIDs[serviceCreateResponse.ID] = name
} }
} }
logrus.Infof("waiting for services to converge: %s", strings.Join(serviceIDs, ", ")) var serviceNames []string
for _, serviceName := range serviceIDs {
serviceNames = append(serviceNames, serviceName)
}
logrus.Infof("waiting for services to converge: %s", strings.Join(serviceNames, ", "))
ch := make(chan error, len(serviceIDs)) ch := make(chan error, len(serviceIDs))
for _, serviceID := range serviceIDs { for serviceID, serviceName := range serviceIDs {
logrus.Debugf("waiting on %s to converge", serviceID) logrus.Debugf("waiting on %s to converge", serviceName)
go func(s string) { go func(s string) {
ch <- waitOnService(ctx, cl, s) ch <- waitOnService(ctx, cl, s)
}(serviceID) }(serviceID)

View File

@ -76,13 +76,13 @@ function install_abra_release {
p=$HOME/.local/bin p=$HOME/.local/bin
com="echo PATH=\$PATH:$p" com="echo PATH=\$PATH:$p"
if [[ $SHELL =~ "bash" ]]; then if [[ $SHELL =~ "bash" ]]; then
echo "echo $com >> $HOME/.bashrc" echo "$com >> $HOME/.bashrc"
elif [[ $SHELL =~ "fizsh" ]]; then elif [[ $SHELL =~ "fizsh" ]]; then
echo "echo $com >> $HOME/.fizsh/.fizshrc" echo "$com >> $HOME/.fizsh/.fizshrc"
elif [[ $SHELL =~ "zsh" ]]; then elif [[ $SHELL =~ "zsh" ]]; then
echo "echo $com >> $HOME/.zshrc" echo "$com >> $HOME/.zshrc"
else else
echo "echo $com >> $HOME/.profile" echo "$com >> $HOME/.profile"
fi fi
fi fi