package cmd
import (
"context"
"fmt"
"github.com/goodrain/rainbond-operator/util/constants"
utils "github.com/goodrain/rainbond/util"
rainbondv1alpha1 "github.com/goodrain/rainbond-operator/api/v1alpha1"
"github.com/goodrain/rainbond/db"
"github.com/goodrain/rainbond/db/config"
"github.com/goodrain/rainbond/grctl/clients"
"github.com/goodrain/rainbond/grctl/registry"
"github.com/pkg/errors"
"github.com/urfave/cli"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
)
func NewCmdRegistry() cli.Command {
c := cli.Command{
Name: "registry",
Usage: "grctl registry [command]",
Subcommands: []cli.Command{
{
Name: "cleanup",
Usage: `Clean up free images in the registry.
The command 'grctl registry cleanup' will delete the index of free images in registry.
Then you have to exec the command below to remove blobs from the filesystem:
bin/registry garbage-collect [--dry-run] /path/to/config.yml
More Detail: https://docs.docker.com/registry/garbage-collection/#run-garbage-collection.
`,
Flags: []cli.Flag{
cli.StringFlag{
Name: "namespace, ns",
Usage: "rainbond namespace",
EnvVar: "RBDNamespace",
Value: utils.GetenvDefault("RBD_NAMESPACE", constants.Namespace),
},
},
Action: func(c *cli.Context) error {
Common(c)
namespace := c.String("namespace")
var cluster rainbondv1alpha1.RainbondCluster
if err := clients.RainbondKubeClient.Get(context.Background(), types.NamespacedName{Namespace: namespace, Name: "rainbondcluster"}, &cluster); err != nil {
return errors.Wrap(err, "get configuration from rainbond cluster")
}
dsn, err := databaseDSN(&cluster)
if err != nil {
return errors.Wrap(err, "get database dsn")
}
dbCfg := config.Config{
MysqlConnectionInfo: dsn,
DBType: "mysql",
}
if err := db.CreateManager(dbCfg); err != nil {
return errors.Wrap(err, "create database manager")
}
registryConfig := cluster.Spec.ImageHub
cleaner, err := registry.NewRegistryCleaner(registryConfig.Domain, registryConfig.Username, registryConfig.Password)
if err != nil {
return errors.WithMessage(err, "create registry cleaner")
}
cleaner.Cleanup()
return nil
},
},
},
}
return c
}
func databaseDSN(rainbondcluster *rainbondv1alpha1.RainbondCluster) (string, error) {
database := rainbondcluster.Spec.RegionDatabase
if database != nil {
return fmt.Sprintf("%s:%s@tcp(%s)/%s", database.Username, database.Password, database.Host, database.Name), nil
}
pod, err := clients.K8SClient.CoreV1().Pods(rainbondcluster.Namespace).Get(context.Background(), "rbd-db-0", metav1.GetOptions{})
if err != nil {
return "", errors.Wrap(err, "get pod rbd-db-0")
}
host := pod.Status.PodIP
name := "region"
for _, ct := range pod.Spec.Containers {
if ct.Name != "rbd-db" {
continue
}
for _, env := range ct.Env {
if env.Name == "MYSQL_DATABASE" {
name = env.Value
}
}
}
secret, err := clients.K8SClient.CoreV1().Secrets(rainbondcluster.Namespace).Get(context.Background(), "rbd-db", metav1.GetOptions{})
if err != nil {
return "", errors.Wrap(err, "get secret rbd-db")
}
username := string(secret.Data["mysql-user"])
password := string(secret.Data["mysql-password"])
return fmt.Sprintf("%s:%s@tcp(%s:3306)/%s", username, password, host, name), nil
}