Compare commits

...

5 Commits

Author SHA1 Message Date
github-actions[bot]
cbee7e6011 Bump version to 2.7.2 (#13562)
Signed-off-by: GitHub <noreply@github.com>
Co-authored-by: leoluz <leoluz@users.noreply.github.com>
2023-05-12 09:26:59 -04:00
gcp-cherry-pick-bot[bot]
8e61f64cc9 fix: update log view on container select (#13474) (#13546)
Signed-off-by: ashutosh16 <11219262+ashutosh16@users.noreply.github.com>
Co-authored-by: asingh <11219262+ashutosh16@users.noreply.github.com>
2023-05-11 09:15:34 -04:00
gcp-cherry-pick-bot[bot]
e413db45b1 fix: surface errors when compressing files (#13491) (#13494)
Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com>
Co-authored-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com>
2023-05-09 12:37:32 -04:00
gcp-cherry-pick-bot[bot]
26cf7d95b7 fix: interpolate gen fix (#12716) (#13061) (#13485)
* Finalizing Appset Interpolation Changes



* Pushing up changes for matrix_test.go



* A now incredibly simple solution



* Updating matrix_test.go to master



* One more fix



* Changes up to now



* Currently working test (Rough)



* Cleanly working across 2 test cases!



* Merged into single test case



---------

Signed-off-by: jkulkarn <jay.p.kulkarni@blackrock.com>
Co-authored-by: Jay P Kulkarni <jkulkarni@ucla.edu>
Co-authored-by: jkulkarn <jay.p.kulkarni@blackrock.com>
2023-05-09 12:36:30 -04:00
gcp-cherry-pick-bot[bot]
24bd4aee70 docs: fix typo (#12960) (#13436)
Signed-off-by: mikutas <23391543+mikutas@users.noreply.github.com>
Co-authored-by: Takumi Sue <23391543+mikutas@users.noreply.github.com>
2023-05-04 18:21:33 -04:00
15 changed files with 325 additions and 49 deletions

View File

@@ -1 +1 @@
2.7.1
2.7.2

View File

@@ -50,10 +50,17 @@ func (m *MatrixGenerator) GenerateParams(appSetGenerator *argoprojiov1alpha1.App
if err != nil {
return nil, err
}
requiresInterpolation := false // Try to generate 2nd generator's params without interpolation
g1, err := m.getParams(appSetGenerator.Matrix.Generators[1], appSet, nil)
if err != nil || g1 == nil {
requiresInterpolation = true
}
for _, a := range g0 {
g1, err := m.getParams(appSetGenerator.Matrix.Generators[1], appSet, a)
if err != nil {
return nil, fmt.Errorf("failed to get params for second generator in the matrix generator: %w", err)
if requiresInterpolation {
g1, err = m.getParams(appSetGenerator.Matrix.Generators[1], appSet, a)
if err != nil {
return nil, fmt.Errorf("failed to get params for second generator in the matrix generator: %w", err)
}
}
for _, b := range g1 {

View File

@@ -2,6 +2,7 @@ package generators
import (
"context"
"github.com/sirupsen/logrus"
"testing"
"time"
@@ -1005,6 +1006,273 @@ func TestMatrixGenerateListElementsYaml(t *testing.T) {
}
}
func TestSkipInterpolatedMatrixCalls(t *testing.T) {
interpolatedGitGenerator := &argoprojiov1alpha1.GitGenerator{
RepoURL: "RepoURL",
Revision: "Revision",
Files: []argoprojiov1alpha1.GitFileGeneratorItem{
{Path: "examples/git-generator-files-discovery/cluster-config/{{name}}.json"},
},
}
nonInterpolatedGitGenerator := &argoprojiov1alpha1.GitGenerator{
RepoURL: "RepoURL",
Revision: "Revision",
Files: []argoprojiov1alpha1.GitFileGeneratorItem{
{Path: "examples/git-generator-files-discovery/cluster-config/base.json"},
},
}
interpolatedClusterGenerator := &argoprojiov1alpha1.ClusterGenerator{
Selector: metav1.LabelSelector{
MatchLabels: nil,
MatchExpressions: []metav1.LabelSelectorRequirement{
{
Key: "environment",
Operator: "Exists",
Values: []string{},
},
},
},
}
testCases := []struct {
name string
baseGenerators []argoprojiov1alpha1.ApplicationSetNestedGenerator
expectedErr error
expected []map[string]interface{}
clientError bool
expectedMock [][]map[string]interface{}
expectedNumCalls int
}{
{
name: "happy flow - generate noninterpolated params",
baseGenerators: []argoprojiov1alpha1.ApplicationSetNestedGenerator{
{ Clusters: interpolatedClusterGenerator },
{ Git: nonInterpolatedGitGenerator },
},
expected: []map[string]interface{}{
{
"path": "examples/git-generator-files-discovery/base.json",
"path.basename": "base",
"path.basenameNormalized": "base",
"path.filename": "base.json",
"path.filenameNormalized": "base.json",
"path[0]": "examples",
"path[1]": "git-generator-files-discovery",
"path[2]": "base",
"name": "dev-01",
"nameNormalized": "dev-01",
"server": "https://dev-01.example.com",
"metadata.labels.environment": "dev",
"metadata.labels.argocd.argoproj.io/secret-type": "cluster",
},
{
"path": "examples/git-generator-files-discovery/base.json",
"path.basename": "base",
"path.basenameNormalized": "base",
"path.filename": "base.json",
"path.filenameNormalized": "base.json",
"path[0]": "examples",
"path[1]": "git-generator-files-discovery",
"path[2]": "base",
"name": "prod-01",
"nameNormalized": "prod-01",
"server": "https://prod-01.example.com",
"metadata.labels.environment": "prod",
"metadata.labels.argocd.argoproj.io/secret-type": "cluster",
},
},
clientError: false,
expectedMock: [][]map[string]interface{}{
{
{
"path": "examples/git-generator-files-discovery/base.json",
"path.basename": "base",
"path.basenameNormalized": "base",
"path.filename": "base.json",
"path.filenameNormalized": "base.json",
"path[0]": "examples",
"path[1]": "git-generator-files-discovery",
"path[2]": "base",
},
},
},
expectedNumCalls: 1,
},
{
name: "happy flow - generate interpolated params",
baseGenerators: []argoprojiov1alpha1.ApplicationSetNestedGenerator{
{ Clusters: interpolatedClusterGenerator },
{ Git: interpolatedGitGenerator },
},
expected: []map[string]interface{}{
{
"path": "examples/git-generator-files-discovery/dev-01.json",
"path.basename": "dev-01",
"path.basenameNormalized": "dev-01",
"path.filename": "dev-01.json",
"path.filenameNormalized": "dev-01.json",
"path[0]": "examples",
"path[1]": "git-generator-files-discovery",
"path[2]": "dev-01",
"name": "dev-01",
"nameNormalized": "dev-01",
"server": "https://dev-01.example.com",
"metadata.labels.environment": "dev",
"metadata.labels.argocd.argoproj.io/secret-type": "cluster",
},
{
"path": "examples/git-generator-files-discovery/prod-01.json",
"path.basename": "prod-01",
"path.basenameNormalized": "prod-01",
"path.filename": "prod-01.json",
"path.filenameNormalized": "prod-01.json",
"path[0]": "examples",
"path[1]": "git-generator-files-discovery",
"path[2]": "prod-01",
"name": "prod-01",
"nameNormalized": "prod-01",
"server": "https://prod-01.example.com",
"metadata.labels.environment": "prod",
"metadata.labels.argocd.argoproj.io/secret-type": "cluster",
},
},
clientError: false,
expectedMock: [][]map[string]interface{}{
{}, // Needed, because the 1st call will fail without interpolation
{ // Subsequent calls will succeed with interpolation
{
"path": "examples/git-generator-files-discovery/dev-01.json",
"path.basename": "dev-01",
"path.basenameNormalized": "dev-01",
"path.filename": "dev-01.json",
"path.filenameNormalized": "dev-01.json",
"path[0]": "examples",
"path[1]": "git-generator-files-discovery",
"path[2]": "dev-01",
},
},
{
{
"path": "examples/git-generator-files-discovery/prod-01.json",
"path.basename": "prod-01",
"path.basenameNormalized": "prod-01",
"path.filename": "prod-01.json",
"path.filenameNormalized": "prod-01.json",
"path[0]": "examples",
"path[1]": "git-generator-files-discovery",
"path[2]": "prod-01",
},
},
},
expectedNumCalls: 3,
},
}
clusters := []client.Object{
&corev1.Secret{
TypeMeta: metav1.TypeMeta{
Kind: "Secret",
APIVersion: "v1",
},
ObjectMeta: metav1.ObjectMeta{
Name: "dev-01",
Namespace: "namespace",
Labels: map[string]string{
"argocd.argoproj.io/secret-type": "cluster",
"environment": "dev",
},
},
Data: map[string][]byte{
"config": []byte("{}"),
"name": []byte("dev-01"),
"server": []byte("https://dev-01.example.com"),
},
Type: corev1.SecretType("Opaque"),
},
&corev1.Secret{
TypeMeta: metav1.TypeMeta{
Kind: "Secret",
APIVersion: "v1",
},
ObjectMeta: metav1.ObjectMeta{
Name: "prod-01",
Namespace: "namespace",
Labels: map[string]string{
"argocd.argoproj.io/secret-type": "cluster",
"environment": "prod",
},
},
Data: map[string][]byte{
"config": []byte("{}"),
"name": []byte("prod-01"),
"server": []byte("https://prod-01.example.com"),
},
Type: corev1.SecretType("Opaque"),
},
}
// convert []client.Object to []runtime.Object, for use by kubefake package
runtimeClusters := []runtime.Object{}
for _, clientCluster := range clusters {
runtimeClusters = append(runtimeClusters, clientCluster)
}
for _, testCase := range testCases {
testCaseCopy := testCase // Since tests may run in parallel
t.Run(testCaseCopy.name, func(t *testing.T) {
genMock := &generatorMock{}
appSet := &argoprojiov1alpha1.ApplicationSet{}
appClientset := kubefake.NewSimpleClientset(runtimeClusters...)
fakeClient := fake.NewClientBuilder().WithObjects(clusters...).Build()
cl := &possiblyErroringFakeCtrlRuntimeClient{
fakeClient,
testCase.clientError,
}
var clusterGenerator = NewClusterGenerator(cl, context.Background(), appClientset, "namespace")
logrus.Debug(clusterGenerator)
for _, g := range testCaseCopy.baseGenerators {
gitGeneratorSpec := argoprojiov1alpha1.ApplicationSetGenerator{
Clusters: g.Clusters,
Git: g.Git,
}
genMock.On("GetTemplate", &gitGeneratorSpec).
Return(&argoprojiov1alpha1.ApplicationSetTemplate{})
}
for _, currMock := range testCaseCopy.expectedMock {
genMock.On("GenerateParams", mock.AnythingOfType("*v1alpha1.ApplicationSetGenerator"), appSet).Return(currMock, nil).Once()
}
var matrixGenerator = NewMatrixGenerator(
map[string]Generator{
"Git": genMock,
"Clusters": clusterGenerator,
},
)
got, err := matrixGenerator.GenerateParams(&argoprojiov1alpha1.ApplicationSetGenerator{
Matrix: &argoprojiov1alpha1.MatrixGenerator{
Generators: testCaseCopy.baseGenerators,
Template: argoprojiov1alpha1.ApplicationSetTemplate{},
},
}, appSet)
genMock.AssertNumberOfCalls(t, "GenerateParams", testCase.expectedNumCalls)
if testCaseCopy.expectedErr != nil {
assert.ErrorIs(t, err, testCaseCopy.expectedErr)
} else {
assert.NoError(t, err)
assert.Equal(t, testCaseCopy.expected, got)
}
})
}
}
type generatorMock struct {
mock.Mock
}

View File

@@ -321,7 +321,7 @@ stringData:
All the examples above talk about Git repositories, but the same principles apply to clusters as well.
With cluster-scoped clusters we can also restrict projects to only allow applications whose destinations belong to the
With project-scoped clusters we can also restrict projects to only allow applications whose destinations belong to the
same project. The default behavior allows for applications to be installed onto clusters which are not a part of the same
project, as the example below demonstrates:

View File

@@ -5,7 +5,7 @@ kind: Kustomization
images:
- name: quay.io/argoproj/argocd
newName: quay.io/argoproj/argocd
newTag: v2.7.1
newTag: v2.7.2
resources:
- ./application-controller
- ./dex

View File

@@ -16700,7 +16700,7 @@ spec:
key: applicationsetcontroller.enable.progressive.syncs
name: argocd-cmd-params-cm
optional: true
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
imagePullPolicy: Always
name: argocd-applicationset-controller
ports:
@@ -16962,7 +16962,7 @@ spec:
value: /helm-working-dir
- name: HELM_DATA_HOME
value: /helm-working-dir
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
imagePullPolicy: Always
livenessProbe:
failureThreshold: 3
@@ -17014,7 +17014,7 @@ spec:
- -n
- /usr/local/bin/argocd
- /var/run/argocd/argocd-cmp-server
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
name: copyutil
securityContext:
allowPrivilegeEscalation: false
@@ -17227,7 +17227,7 @@ spec:
key: controller.kubectl.parallelism.limit
name: argocd-cmd-params-cm
optional: true
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
imagePullPolicy: Always
name: argocd-application-controller
ports:

View File

@@ -12,4 +12,4 @@ resources:
images:
- name: quay.io/argoproj/argocd
newName: quay.io/argoproj/argocd
newTag: v2.7.1
newTag: v2.7.2

View File

@@ -12,7 +12,7 @@ patches:
images:
- name: quay.io/argoproj/argocd
newName: quay.io/argoproj/argocd
newTag: v2.7.1
newTag: v2.7.2
resources:
- ../../base/application-controller
- ../../base/applicationset-controller

View File

@@ -17921,7 +17921,7 @@ spec:
key: applicationsetcontroller.enable.progressive.syncs
name: argocd-cmd-params-cm
optional: true
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
imagePullPolicy: Always
name: argocd-applicationset-controller
ports:
@@ -18031,7 +18031,7 @@ spec:
- -n
- /usr/local/bin/argocd
- /shared/argocd-dex
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
imagePullPolicy: Always
name: copyutil
securityContext:
@@ -18088,7 +18088,7 @@ spec:
containers:
- args:
- /usr/local/bin/argocd-notifications
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
imagePullPolicy: Always
livenessProbe:
tcpSocket:
@@ -18393,7 +18393,7 @@ spec:
value: /helm-working-dir
- name: HELM_DATA_HOME
value: /helm-working-dir
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
imagePullPolicy: Always
livenessProbe:
failureThreshold: 3
@@ -18445,7 +18445,7 @@ spec:
- -n
- /usr/local/bin/argocd
- /var/run/argocd/argocd-cmp-server
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
name: copyutil
securityContext:
allowPrivilegeEscalation: false
@@ -18727,7 +18727,7 @@ spec:
key: server.enable.proxy.extension
name: argocd-cmd-params-cm
optional: true
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
imagePullPolicy: Always
livenessProbe:
httpGet:
@@ -18972,7 +18972,7 @@ spec:
key: controller.kubectl.parallelism.limit
name: argocd-cmd-params-cm
optional: true
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
imagePullPolicy: Always
name: argocd-application-controller
ports:

View File

@@ -1581,7 +1581,7 @@ spec:
key: applicationsetcontroller.enable.progressive.syncs
name: argocd-cmd-params-cm
optional: true
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
imagePullPolicy: Always
name: argocd-applicationset-controller
ports:
@@ -1691,7 +1691,7 @@ spec:
- -n
- /usr/local/bin/argocd
- /shared/argocd-dex
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
imagePullPolicy: Always
name: copyutil
securityContext:
@@ -1748,7 +1748,7 @@ spec:
containers:
- args:
- /usr/local/bin/argocd-notifications
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
imagePullPolicy: Always
livenessProbe:
tcpSocket:
@@ -2053,7 +2053,7 @@ spec:
value: /helm-working-dir
- name: HELM_DATA_HOME
value: /helm-working-dir
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
imagePullPolicy: Always
livenessProbe:
failureThreshold: 3
@@ -2105,7 +2105,7 @@ spec:
- -n
- /usr/local/bin/argocd
- /var/run/argocd/argocd-cmp-server
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
name: copyutil
securityContext:
allowPrivilegeEscalation: false
@@ -2387,7 +2387,7 @@ spec:
key: server.enable.proxy.extension
name: argocd-cmd-params-cm
optional: true
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
imagePullPolicy: Always
livenessProbe:
httpGet:
@@ -2632,7 +2632,7 @@ spec:
key: controller.kubectl.parallelism.limit
name: argocd-cmd-params-cm
optional: true
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
imagePullPolicy: Always
name: argocd-application-controller
ports:

View File

@@ -17038,7 +17038,7 @@ spec:
key: applicationsetcontroller.enable.progressive.syncs
name: argocd-cmd-params-cm
optional: true
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
imagePullPolicy: Always
name: argocd-applicationset-controller
ports:
@@ -17148,7 +17148,7 @@ spec:
- -n
- /usr/local/bin/argocd
- /shared/argocd-dex
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
imagePullPolicy: Always
name: copyutil
securityContext:
@@ -17205,7 +17205,7 @@ spec:
containers:
- args:
- /usr/local/bin/argocd-notifications
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
imagePullPolicy: Always
livenessProbe:
tcpSocket:
@@ -17462,7 +17462,7 @@ spec:
value: /helm-working-dir
- name: HELM_DATA_HOME
value: /helm-working-dir
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
imagePullPolicy: Always
livenessProbe:
failureThreshold: 3
@@ -17514,7 +17514,7 @@ spec:
- -n
- /usr/local/bin/argocd
- /var/run/argocd/argocd-cmp-server
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
name: copyutil
securityContext:
allowPrivilegeEscalation: false
@@ -17789,7 +17789,7 @@ spec:
key: server.enable.proxy.extension
name: argocd-cmd-params-cm
optional: true
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
imagePullPolicy: Always
livenessProbe:
httpGet:
@@ -18029,7 +18029,7 @@ spec:
key: controller.kubectl.parallelism.limit
name: argocd-cmd-params-cm
optional: true
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
imagePullPolicy: Always
name: argocd-application-controller
ports:

View File

@@ -698,7 +698,7 @@ spec:
key: applicationsetcontroller.enable.progressive.syncs
name: argocd-cmd-params-cm
optional: true
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
imagePullPolicy: Always
name: argocd-applicationset-controller
ports:
@@ -808,7 +808,7 @@ spec:
- -n
- /usr/local/bin/argocd
- /shared/argocd-dex
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
imagePullPolicy: Always
name: copyutil
securityContext:
@@ -865,7 +865,7 @@ spec:
containers:
- args:
- /usr/local/bin/argocd-notifications
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
imagePullPolicy: Always
livenessProbe:
tcpSocket:
@@ -1122,7 +1122,7 @@ spec:
value: /helm-working-dir
- name: HELM_DATA_HOME
value: /helm-working-dir
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
imagePullPolicy: Always
livenessProbe:
failureThreshold: 3
@@ -1174,7 +1174,7 @@ spec:
- -n
- /usr/local/bin/argocd
- /var/run/argocd/argocd-cmp-server
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
name: copyutil
securityContext:
allowPrivilegeEscalation: false
@@ -1449,7 +1449,7 @@ spec:
key: server.enable.proxy.extension
name: argocd-cmd-params-cm
optional: true
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
imagePullPolicy: Always
livenessProbe:
httpGet:
@@ -1689,7 +1689,7 @@ spec:
key: controller.kubectl.parallelism.limit
name: argocd-cmd-params-cm
optional: true
image: quay.io/argoproj/argocd:v2.7.1
image: quay.io/argoproj/argocd:v2.7.2
imagePullPolicy: Always
name: argocd-application-controller
ports:

View File

@@ -1,7 +1,7 @@
import * as React from 'react';
import {Tooltip} from 'argo-ui';
export type ContainerGroup = {offset: number; containers: string[]};
export type ContainerGroup = {offset: number; containers: {name: string}[]};
// ContainerSelector is a component that renders a dropdown menu of containers
export const ContainerSelector = ({
@@ -16,13 +16,14 @@ export const ContainerSelector = ({
if (!containerGroups) {
return <></>;
}
const containers = containerGroups?.reduce((acc, group) => acc.concat(group.containers), []);
const containerNames = containers?.map(container => container.name);
const containerGroup = (n: string) => {
return containerGroups.find(group => group.containers.find(container => container === n));
return containerGroups?.find(group => group.containers?.find(container => container.name === n));
};
const containerIndex = (n: string) => {
return containerGroup(n).containers.findIndex(container => container === n);
return containerGroup(n)?.containers.findIndex(container => container.name === n);
};
if (containerNames.length <= 1) return <></>;
return (

View File

@@ -109,12 +109,12 @@ func SendRepoStream(ctx context.Context, appPath, repoPath string, sender Stream
func GetCompressedRepoAndMetadata(repoPath string, appPath string, env []string, excludedGlobs []string, opt *senderOption) (*os.File, *pluginclient.AppStreamRequest, error) {
// compress all files in appPath in tgz
tgz, filesWritten, checksum, err := tgzstream.CompressFiles(repoPath, nil, excludedGlobs)
if filesWritten == 0 {
return nil, nil, fmt.Errorf("no files to send")
}
if err != nil {
return nil, nil, fmt.Errorf("error compressing repo files: %w", err)
}
if filesWritten == 0 {
return nil, nil, fmt.Errorf("no files to send")
}
if opt != nil && opt.tarDoneChan != nil {
opt.tarDoneChan <- true
close(opt.tarDoneChan)

View File

@@ -40,12 +40,12 @@ type RepoStreamReceiver interface {
// SendApplicationManifestQueryWithFiles compresses a folder and sends it over the stream
func SendApplicationManifestQueryWithFiles(ctx context.Context, stream ApplicationStreamSender, appName string, appNs string, dir string, inclusions []string) error {
f, filesWritten, checksum, err := tgzstream.CompressFiles(dir, inclusions, nil)
if filesWritten == 0 {
return fmt.Errorf("no files to send")
}
if err != nil {
return fmt.Errorf("failed to compress files: %w", err)
}
if filesWritten == 0 {
return fmt.Errorf("no files to send")
}
err = stream.Send(&applicationpkg.ApplicationManifestQueryWithFilesWrapper{
Part: &applicationpkg.ApplicationManifestQueryWithFilesWrapper_Query{