Skip to content

Commit

Permalink
Enable wait for RepositoryServer CR to get ready functionality for ac…
Browse files Browse the repository at this point in the history
…tionsets (#2228)

* Enable wait for resources to get ready functionality for actionsets

Signed-off-by: Rajat Gupta <rajat.gupta@veeam.com>

* rename waitForRepositoryServerReadyFlagName value

Signed-off-by: Rajat Gupta <rajat.gupta@veeam.com>

* Remove unnecessary else in code block

Signed-off-by: Rajat Gupta <rajat.gupta@veeam.com>

* Update pkg/kanctl/actionset.go

Co-authored-by: Pavan Navarathna <6504783+pavannd1@users.noreply.github.com>

* Change order of arguments in function verifyRepositoryServerParams

Signed-off-by: Rajat Gupta <rajat.gupta@veeam.com>

---------

Signed-off-by: Rajat Gupta <rajat.gupta@veeam.com>
Co-authored-by: Pavan Navarathna <6504783+pavannd1@users.noreply.github.com>
  • Loading branch information
r4rajat and pavannd1 authored Jul 28, 2023
1 parent d745629 commit 7df4275
Showing 1 changed file with 42 additions and 22 deletions.
64 changes: 42 additions & 22 deletions pkg/kanctl/actionset.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,28 +34,30 @@ import (
"github.com/kanisterio/kanister/pkg/client/clientset/versioned"
"github.com/kanisterio/kanister/pkg/kube"
"github.com/kanisterio/kanister/pkg/param"
"github.com/kanisterio/kanister/pkg/poll"
osversioned "github.com/openshift/client-go/apps/clientset/versioned"
)

const (
actionFlagName = "action"
actionSetFlagName = "action-set"
blueprintFlagName = "blueprint"
configMapsFlagName = "config-maps"
deploymentFlagName = "deployment"
optionsFlagName = "options"
profileFlagName = "profile"
repositoryServerFlagName = "repository-server"
pvcFlagName = "pvc"
secretsFlagName = "secrets"
statefulSetFlagName = "statefulset"
deploymentConfigFlagName = "deploymentconfig"
sourceFlagName = "from"
selectorFlagName = "selector"
selectorKindFlag = "kind"
selectorNamespaceFlag = "selector-namespace"
namespaceTargetsFlagName = "namespacetargets"
objectsFlagName = "objects"
actionFlagName = "action"
actionSetFlagName = "action-set"
blueprintFlagName = "blueprint"
configMapsFlagName = "config-maps"
deploymentFlagName = "deployment"
optionsFlagName = "options"
profileFlagName = "profile"
repositoryServerFlagName = "repository-server"
pvcFlagName = "pvc"
secretsFlagName = "secrets"
statefulSetFlagName = "statefulset"
deploymentConfigFlagName = "deploymentconfig"
sourceFlagName = "from"
selectorFlagName = "selector"
selectorKindFlag = "kind"
selectorNamespaceFlag = "selector-namespace"
namespaceTargetsFlagName = "namespacetargets"
objectsFlagName = "objects"
waitForRepositoryServerReadyFlagName = "wait-for-repository-server"
)

var (
Expand Down Expand Up @@ -105,6 +107,7 @@ func newActionSetCmd() *cobra.Command {
cmd.Flags().String(selectorNamespaceFlag, "", "namespace to apply selector on. Used along with the selector specified using --selector/-l")
cmd.Flags().StringSliceP(namespaceTargetsFlagName, "T", []string{}, "namespaces for the action set, comma separated list of namespaces (eg: --namespacetargets namespace1,namespace2)")
cmd.Flags().StringSliceP(objectsFlagName, "O", []string{}, "objects for the action set, comma separated list of object references (eg: --objects group/version/resource/namespace1/name1,group/version/resource/namespace2/name2)")
cmd.Flags().BoolP(waitForRepositoryServerReadyFlagName, "w", false, "wait for repository server to be ready before creating actionset")
return cmd
}

Expand All @@ -121,7 +124,8 @@ func initializeAndPerform(cmd *cobra.Command, args []string) error {
ctx := context.Background()
valFlag, _ := cmd.Flags().GetBool(skipValidationFlag)
if !valFlag {
err = verifyParams(ctx, params, cli, crCli, osCli)
repoServerReady, _ := cmd.Flags().GetBool(waitForRepositoryServerReadyFlagName)
err = verifyParams(ctx, params, cli, crCli, osCli, repoServerReady)
if err != nil {
return err
}
Expand Down Expand Up @@ -643,7 +647,7 @@ func parseName(k string, r string) (namespace, name string, err error) {
return m[1], m[2], nil
}

func verifyParams(ctx context.Context, p *PerformParams, cli kubernetes.Interface, crCli versioned.Interface, osCli osversioned.Interface) error {
func verifyParams(ctx context.Context, p *PerformParams, cli kubernetes.Interface, crCli versioned.Interface, osCli osversioned.Interface, waitForRepoServerReady bool) error {
const notFoundTmpl = "Please make sure '%s' with name '%s' exists in namespace '%s'"
msgs := make(chan error)
wg := sync.WaitGroup{}
Expand Down Expand Up @@ -674,7 +678,7 @@ func verifyParams(ctx context.Context, p *PerformParams, cli kubernetes.Interfac
// RepositoryServer
go func() {
defer wg.Done()
err := verifyRepositoryServerParams(p.RepositoryServer, crCli, ctx)
err := verifyRepositoryServerParams(ctx, crCli, p.RepositoryServer, waitForRepoServerReady)
if err != nil {
msgs <- err
}
Expand Down Expand Up @@ -755,7 +759,7 @@ func generateActionSetName(p *PerformParams) (string, error) {
return "", errMissingFieldActionName
}

func verifyRepositoryServerParams(repoServer *crv1alpha1.ObjectReference, crCli versioned.Interface, ctx context.Context) error {
func verifyRepositoryServerParams(ctx context.Context, crCli versioned.Interface, repoServer *crv1alpha1.ObjectReference, waitForRepoServerReady bool) error {
if repoServer != nil {
rs, err := crCli.CrV1alpha1().RepositoryServers(repoServer.Namespace).Get(ctx, repoServer.Name, metav1.GetOptions{})
if err != nil {
Expand All @@ -764,6 +768,9 @@ func verifyRepositoryServerParams(repoServer *crv1alpha1.ObjectReference, crCli
}
return errors.New("error while fetching repo server")
}
if waitForRepoServerReady {
return waitForKopiaRepositoryServerReady(ctx, crCli, rs)
}
if rs.Status.Progress != crv1alpha1.Ready {
err = errors.New("Repository Server Not Ready")
return errors.Wrapf(err, "Please make sure that Repository Server CR '%s' is in Ready State", repoServer.Name)
Expand All @@ -772,6 +779,19 @@ func verifyRepositoryServerParams(repoServer *crv1alpha1.ObjectReference, crCli
return nil
}

func waitForKopiaRepositoryServerReady(ctx context.Context, crCli versioned.Interface, rs *crv1alpha1.RepositoryServer) error {
timeoutCtx, waitCancel := context.WithTimeout(ctx, contextWaitTimeout)
defer waitCancel()
pollErr := poll.Wait(timeoutCtx, func(ctx context.Context) (bool, error) {
repositoryServer, err := crCli.CrV1alpha1().RepositoryServers(rs.GetNamespace()).Get(ctx, rs.GetName(), metav1.GetOptions{})
return repositoryServer.Status.Progress == crv1alpha1.Ready, err
})
if pollErr != nil {
return errors.Wrapf(pollErr, "Failed while waiting for Repository Server %s/%s to be Ready", rs.GetNamespace(), rs.GetName())
}
return nil
}

func verifyObjectParams(p *PerformParams, cli kubernetes.Interface, osCli osversioned.Interface, ctx context.Context) error {
var err error
for _, obj := range p.Objects {
Expand Down

0 comments on commit 7df4275

Please sign in to comment.