2021-09-05 21:17:35 +00:00
|
|
|
package app
|
|
|
|
|
|
|
|
import (
|
2021-09-08 10:55:33 +00:00
|
|
|
"context"
|
|
|
|
"fmt"
|
|
|
|
"strings"
|
|
|
|
|
2021-09-05 21:17:35 +00:00
|
|
|
"coopcloud.tech/abra/pkg/config"
|
2021-10-21 17:35:13 +00:00
|
|
|
"coopcloud.tech/abra/pkg/upstream/stack"
|
2021-09-08 10:55:33 +00:00
|
|
|
apiclient "github.com/docker/docker/client"
|
2021-09-10 22:54:02 +00:00
|
|
|
"github.com/sirupsen/logrus"
|
2021-09-05 21:17:35 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// Get retrieves an app
|
|
|
|
func Get(appName string) (config.App, error) {
|
|
|
|
files, err := config.LoadAppFiles("")
|
|
|
|
if err != nil {
|
|
|
|
return config.App{}, err
|
|
|
|
}
|
|
|
|
|
|
|
|
app, err := config.GetApp(files, appName)
|
|
|
|
if err != nil {
|
|
|
|
return config.App{}, err
|
|
|
|
}
|
|
|
|
|
2021-09-10 22:54:02 +00:00
|
|
|
logrus.Debugf("retrieved '%s' for '%s'", app, appName)
|
|
|
|
|
2021-09-05 21:17:35 +00:00
|
|
|
return app, nil
|
|
|
|
}
|
2021-09-08 10:55:33 +00:00
|
|
|
|
|
|
|
// deployedServiceSpec represents a deployed service of an app.
|
|
|
|
type deployedServiceSpec struct {
|
|
|
|
Name string
|
|
|
|
Version string
|
|
|
|
}
|
|
|
|
|
|
|
|
// VersionSpec represents a deployed app and associated metadata.
|
|
|
|
type VersionSpec map[string]deployedServiceSpec
|
|
|
|
|
|
|
|
// DeployedVersions lists metadata (e.g. versions) for deployed
|
|
|
|
func DeployedVersions(ctx context.Context, cl *apiclient.Client, app config.App) (VersionSpec, bool, error) {
|
|
|
|
services, err := stack.GetStackServices(ctx, cl, app.StackName())
|
|
|
|
if err != nil {
|
|
|
|
return VersionSpec{}, false, err
|
|
|
|
}
|
|
|
|
|
|
|
|
appSpec := make(VersionSpec)
|
|
|
|
for _, service := range services {
|
|
|
|
serviceName := ParseServiceName(service.Spec.Name)
|
|
|
|
label := fmt.Sprintf("coop-cloud.%s.%s.version", app.StackName(), serviceName)
|
|
|
|
if deployLabel, ok := service.Spec.Labels[label]; ok {
|
|
|
|
version, _ := ParseVersionLabel(deployLabel)
|
|
|
|
appSpec[serviceName] = deployedServiceSpec{Name: serviceName, Version: version}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-09-10 22:54:02 +00:00
|
|
|
deployed := len(services) > 0
|
|
|
|
|
|
|
|
if deployed {
|
2021-12-21 01:28:14 +00:00
|
|
|
logrus.Debugf("detected %s as deployed versions of %s", appSpec, app.Name)
|
2021-09-10 22:54:02 +00:00
|
|
|
} else {
|
2021-12-21 01:28:14 +00:00
|
|
|
logrus.Debugf("detected %s as not deployed", app.Name)
|
2021-09-10 22:54:02 +00:00
|
|
|
}
|
|
|
|
|
2021-09-08 10:55:33 +00:00
|
|
|
return appSpec, len(services) > 0, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// ParseVersionLabel parses a $VERSION-$DIGEST app service label.
|
|
|
|
func ParseVersionLabel(label string) (string, string) {
|
|
|
|
// versions may look like v4.2-abcd or v4.2-alpine-abcd
|
|
|
|
idx := strings.LastIndex(label, "-")
|
2021-09-10 22:54:02 +00:00
|
|
|
version := label[:idx]
|
|
|
|
digest := label[idx+1:]
|
2021-12-21 01:28:14 +00:00
|
|
|
logrus.Debugf("parsed %s as version from %s", version, label)
|
|
|
|
logrus.Debugf("parsed %s as digest from %s", digest, label)
|
2021-09-10 22:54:02 +00:00
|
|
|
return version, digest
|
2021-09-08 10:55:33 +00:00
|
|
|
}
|
|
|
|
|
2021-12-21 01:28:14 +00:00
|
|
|
// ParseServiceName parses a $STACK_NAME_$SERVICE_NAME service label.
|
2021-09-08 10:55:33 +00:00
|
|
|
func ParseServiceName(label string) string {
|
|
|
|
idx := strings.LastIndex(label, "_")
|
2021-09-10 22:54:02 +00:00
|
|
|
serviceName := label[idx+1:]
|
2021-12-21 01:28:14 +00:00
|
|
|
logrus.Debugf("parsed %s as service name from %s", serviceName, label)
|
2021-09-10 22:54:02 +00:00
|
|
|
return serviceName
|
2021-09-08 10:55:33 +00:00
|
|
|
}
|