Skip to content

Commit

Permalink
chore: Select app resources tests (#9268)
Browse files Browse the repository at this point in the history
* add to approvers

Signed-off-by: pashavictorovich <pavel@codefresh.io>

* application selected resources test

Signed-off-by: pashavictorovich <pavel@codefresh.io>

* change error

Signed-off-by: pashavictorovich <pavel@codefresh.io>
  • Loading branch information
pasha-codefresh authored May 4, 2022
1 parent ee1e3f2 commit 194f090
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 38 deletions.
87 changes: 49 additions & 38 deletions cmd/argocd/commands/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -569,16 +569,16 @@ func NewApplicationSetCommand(clientOpts *argocdclient.ClientOptions) *cobra.Com

// unsetOpts describe what to unset in an Application.
type unsetOpts struct {
namePrefix bool
nameSuffix bool
kustomizeVersion bool
kustomizeImages []string
parameters []string
valuesFiles []string
valuesLiteral bool
namePrefix bool
nameSuffix bool
kustomizeVersion bool
kustomizeImages []string
parameters []string
valuesFiles []string
valuesLiteral bool
ignoreMissingValueFiles bool
pluginEnvs []string
passCredentials bool
pluginEnvs []string
passCredentials bool
}

// NewApplicationUnsetCommand returns a new instance of an `argocd app unset` command
Expand Down Expand Up @@ -1210,35 +1210,44 @@ const (
resourceFieldNameWithNamespaceCount = 2
)

func parseSelectedResources(resources []string) []*argoappv1.SyncOperationResource {
// resource is GROUP:KIND:NAMESPACE/NAME or GROUP:KIND:NAME
func parseSelectedResources(resources []string) ([]*argoappv1.SyncOperationResource, error) {
// retrieve name and namespace in case if format is GROUP:KIND:NAMESPACE/NAME, otherwise return name and empty namespace
nameRetriever := func(resourceName, resource string) (string, string, error) {
if !strings.Contains(resourceName, resourceFieldNamespaceDelimiter) {
return resourceName, "", nil
}
nameFields := strings.Split(resourceName, resourceFieldNamespaceDelimiter)
if len(nameFields) != resourceFieldNameWithNamespaceCount {
return "", "", fmt.Errorf("Resource with namespace should have GROUP%sKIND%sNAMESPACE%sNAME, but instead got: %s", resourceFieldDelimiter, resourceFieldDelimiter, resourceFieldNamespaceDelimiter, resource)
}
namespace := nameFields[0]
name := nameFields[1]
return name, namespace, nil
}

var selectedResources []*argoappv1.SyncOperationResource
if resources != nil {
selectedResources = []*argoappv1.SyncOperationResource{}
for _, r := range resources {
fields := strings.Split(r, resourceFieldDelimiter)
if len(fields) != resourceFieldCount {
log.Fatalf("Resource should have GROUP%sKIND%sNAME, but instead got: %s", resourceFieldDelimiter, resourceFieldDelimiter, r)
}
name := fields[2]
namespace := ""
if strings.Contains(fields[2], resourceFieldNamespaceDelimiter) {
nameFields := strings.Split(fields[2], resourceFieldNamespaceDelimiter)
if len(nameFields) != resourceFieldNameWithNamespaceCount {
log.Fatalf("Resource with namespace should have GROUP%sKIND%sNAMESPACE%sNAME, but instead got: %s", resourceFieldDelimiter, resourceFieldDelimiter, resourceFieldNamespaceDelimiter, r)
}
namespace = nameFields[0]
name = nameFields[1]
}
rsrc := argoappv1.SyncOperationResource{
Group: fields[0],
Kind: fields[1],
Name: name,
Namespace: namespace,
}
selectedResources = append(selectedResources, &rsrc)
if resources == nil {
return selectedResources, nil
}

for _, resource := range resources {
fields := strings.Split(resource, resourceFieldDelimiter)
if len(fields) != resourceFieldCount {
return nil, fmt.Errorf("Resource should have GROUP%sKIND%sNAME, but instead got: %s", resourceFieldDelimiter, resourceFieldDelimiter, resource)
}
name, namespace, err := nameRetriever(fields[2], resource)
if err != nil {
return nil, err
}
selectedResources = append(selectedResources, &argoappv1.SyncOperationResource{
Group: fields[0],
Kind: fields[1],
Name: name,
Namespace: namespace,
})
}
return selectedResources
return selectedResources, nil
}

func getWatchOpts(watch watchOpts) watchOpts {
Expand Down Expand Up @@ -1278,7 +1287,8 @@ func NewApplicationWaitCommand(clientOpts *argocdclient.ClientOptions) *cobra.Co
os.Exit(1)
}
watch = getWatchOpts(watch)
selectedResources := parseSelectedResources(resources)
selectedResources, err := parseSelectedResources(resources)
errors.CheckError(err)
appNames := args
acdClient := headless.NewClientOrDie(clientOpts, c)
closer, appIf := acdClient.NewApplicationClientOrDie()
Expand Down Expand Up @@ -1415,7 +1425,8 @@ func NewApplicationSyncCommand(clientOpts *argocdclient.ClientOptions) *cobra.Co
}
}

selectedResources := parseSelectedResources(resources)
selectedResources, err := parseSelectedResources(resources)
errors.CheckError(err)

var localObjsStrings []string
diffOption := &DifferenceOption{}
Expand Down Expand Up @@ -1514,7 +1525,7 @@ func NewApplicationSyncCommand(clientOpts *argocdclient.ClientOptions) *cobra.Co
}
}
ctx := context.Background()
_, err := appIf.Sync(ctx, &syncReq)
_, err = appIf.Sync(ctx, &syncReq)
errors.CheckError(err)

if !async {
Expand Down
39 changes: 39 additions & 0 deletions cmd/argocd/commands/app_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -965,6 +965,45 @@ func Test_unset_nothingToUnset(t *testing.T) {
}
}

func TestParseSelectedResources(t *testing.T) {
resources := []string{"v1alpha:Application:test", "v1alpha:Application:namespace/test"}
operationResources, err := parseSelectedResources(resources)
assert.NoError(t, err)
assert.Len(t, operationResources, 2)
assert.Equal(t, *operationResources[0], v1alpha1.SyncOperationResource{
Namespace: "",
Name: "test",
Kind: "Application",
Group: "v1alpha",
})
assert.Equal(t, *operationResources[1], v1alpha1.SyncOperationResource{
Namespace: "namespace",
Name: "test",
Kind: "Application",
Group: "v1alpha",
})
}

func TestParseSelectedResourcesIncorrect(t *testing.T) {
resources := []string{"v1alpha:test", "v1alpha:Application:namespace/test"}
_, err := parseSelectedResources(resources)
assert.ErrorContains(t, err, "v1alpha:test")
}

func TestParseSelectedResourcesIncorrectNamespace(t *testing.T) {
resources := []string{"v1alpha:Application:namespace/test/unknown"}
_, err := parseSelectedResources(resources)
assert.ErrorContains(t, err, "v1alpha:Application:namespace/test/unknown")

}

func TestParseSelectedResourcesEmptyList(t *testing.T) {
var resources []string
operationResources, err := parseSelectedResources(resources)
assert.NoError(t, err)
assert.Len(t, operationResources, 0)
}

func TestPrintApplicationTableNotWide(t *testing.T) {
output, err := captureOutput(func() error {
app := &v1alpha1.Application{
Expand Down

0 comments on commit 194f090

Please sign in to comment.