Skip to content

Commit

Permalink
Allow custom mount points to be added to vertica (#89)
Browse files Browse the repository at this point in the history
This adds the ability to add custom volume mounts to the
Vertica container. A new spec.volumeMounts parameter was
added to achieve this. It works alongside the
spec.volumes parameter.

Here is an example that mounts the path /tenants in the
Vertica container using an existing PVC.

apiVersion: vertica.com/v1beta1
kind: VerticaDB
metadata:
  name: verticadb-sample
spec:
  communal:
    ...
  subclusters:
  - name: sc1
  volumeMounts:
  - mountPath: /tenants
    name: tenants
  volumes:
  - name: tenants
    persistentVolumeClaim:
      claimName: vertica-pvc

The volumeMounts parameter takes the standard set of
options for volume mounts (e.g. same as
pod.spec.containers.volumeMounts).

The mount path for the new volume mount cannot conflict
with any existing. The webhook was updated to detect any
conflicts.

To avoid a circular dependency with the imports, I had
to move a few helper functions in the paths package to
api/v1beta1.
  • Loading branch information
spilchen authored Oct 29, 2021
1 parent 26614b8 commit 94a5009
Show file tree
Hide file tree
Showing 17 changed files with 143 additions and 85 deletions.
52 changes: 49 additions & 3 deletions api/v1beta1/verticadb_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,10 @@ limitations under the License.
package v1beta1

import (
"fmt"
"regexp"

"github.com/vertica/vertica-kubernetes/pkg/paths"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
Expand Down Expand Up @@ -181,12 +183,22 @@ type VerticaDBSpec struct {
Sidecars []corev1.Container `json:"sidecars,omitempty"`

// +kubebuilder:validation:Optional
// Custom volumes that are added to sidecars. Each sidecar must include
// the volume in the volumeMounts for it to appear in the container. It
// accepts any valid volume type. A unique name must be given for each
// Custom volumes that are added to sidecars and the Vertica container.
// For these volumes to be visible in either container, they must have a
// corresonding volumeMounts entry. For sidecars, this is included in
// `spec.sidecars[*].volumeMounts`. For the Vertica container, it is
// included in `spec.volumeMounts`.
//
// This accepts any valid volume type. A unique name must be given for each
// volume and it cannot conflict with any of the internally generated volumes.
Volumes []corev1.Volume `json:"volumes,omitempty"`

// +kubebuilder:validation:Optional
// Additional volume mounts to include in the Vertica container. These
// reference volumes that are in the Volumes list. The mount path must not
// conflict with a mount path that the operator adds internally.
VolumeMounts []corev1.VolumeMount `json:"volumeMounts,omitempty"`

// +kubebuilder:validation:Optional
// Secrets that will be mounted in the vertica container. The purpose of
// this is to allow custom certs to be available. The full path is:
Expand Down Expand Up @@ -622,3 +634,37 @@ func (v *VerticaDB) GetVerticaVersion() (string, bool) {
ver, ok := v.ObjectMeta.Annotations[VersionAnnotation]
return ver, ok
}

// GenInstallerIndicatorFileName returns the name of the installer indicator file.
// Valid only for the current instance of the vdb.
func (v *VerticaDB) GenInstallerIndicatorFileName() string {
return paths.InstallerIndicatorFile + string(v.UID)
}

// GetPVSubPath returns the subpath in the local data PV.
// We use the UID so that we create unique paths in the PV. If the PV is reused
// for a new vdb, the UID will be different.
func (v *VerticaDB) GetPVSubPath(subPath string) string {
return fmt.Sprintf("%s/%s", v.UID, subPath)
}

// GetDBDataPath get the data path for the current database
func (v *VerticaDB) GetDBDataPath() string {
return fmt.Sprintf("%s/%s", v.Spec.Local.DataPath, v.Spec.DBName)
}

// GetCommunalPath returns the path to use for communal storage
func (v *VerticaDB) GetCommunalPath() string {
// We include the UID in the communal path to generate a unique path for
// each new instance of vdb. This means we can't use the same base path for
// different databases and we don't require any cleanup if the vdb was
// recreated.
if !v.Spec.Communal.IncludeUIDInPath {
return v.Spec.Communal.Path
}
return fmt.Sprintf("%s/%s", v.Spec.Communal.Path, v.UID)
}

func (v *VerticaDB) GetDepotPath() string {
return fmt.Sprintf("%s/%s", v.Spec.Local.DepotPath, v.Spec.DBName)
}
24 changes: 6 additions & 18 deletions pkg/paths/paths_test.go → api/v1beta1/verticadb_types_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,39 +13,27 @@
limitations under the License.
*/

package paths
package v1beta1

import (
"testing"

. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
vapi "github.com/vertica/vertica-kubernetes/api/v1beta1"
"sigs.k8s.io/controller-runtime/pkg/envtest/printer"
)

func TestAPIs(t *testing.T) {
RegisterFailHandler(Fail)

RunSpecsWithDefaultAndCustomReporters(t,
"paths Suite",
[]Reporter{printer.NewlineReporter{}})
}

var _ = Describe("paths", func() {
var _ = Describe("verticadb_types", func() {
const FakeUID = "abcdef"

It("should include UID in path if IncludeUIDInPath is set", func() {
vdb := vapi.MakeVDB()
vdb := MakeVDB()
vdb.ObjectMeta.UID = FakeUID
vdb.Spec.Communal.IncludeUIDInPath = true
Expect(GetCommunalPath(vdb)).Should(ContainSubstring(string(vdb.ObjectMeta.UID)))
Expect(vdb.GetCommunalPath()).Should(ContainSubstring(string(vdb.ObjectMeta.UID)))
})

It("should not include UID in path if IncludeUIDInPath is not set", func() {
vdb := vapi.MakeVDB()
vdb := MakeVDB()
vdb.ObjectMeta.UID = FakeUID
vdb.Spec.Communal.IncludeUIDInPath = false
Expect(GetCommunalPath(vdb)).ShouldNot(ContainSubstring(string(vdb.ObjectMeta.UID)))
Expect(vdb.GetCommunalPath()).ShouldNot(ContainSubstring(string(vdb.ObjectMeta.UID)))
})
})
28 changes: 28 additions & 0 deletions api/v1beta1/verticadb_webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
"fmt"
"strings"

"github.com/vertica/vertica-kubernetes/pkg/paths"
v1 "k8s.io/api/core/v1"
apierrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/runtime"
Expand Down Expand Up @@ -242,6 +243,7 @@ func (v *VerticaDB) validateVerticaDBSpec() field.ErrorList {
allErrs = v.isServiceTypeValid(allErrs)
allErrs = v.hasDuplicateScName(allErrs)
allErrs = v.hasValidVolumeName(allErrs)
allErrs = v.hasValidVolumeMountName(allErrs)
if len(allErrs) == 0 {
return nil
}
Expand Down Expand Up @@ -490,6 +492,32 @@ func (v *VerticaDB) hasValidVolumeName(allErrs field.ErrorList) field.ErrorList
return allErrs
}

// hasValidVolumeMountName checks wether any of the custom volume mounts added
// shared a name with any of the generated paths.
func (v *VerticaDB) hasValidVolumeMountName(allErrs field.ErrorList) field.ErrorList {
invalidPaths := make([]string, len(paths.MountPaths))
copy(invalidPaths, paths.MountPaths)
invalidPaths = append(invalidPaths, v.Spec.Local.DataPath, v.Spec.Local.DepotPath)
for i := range v.Spec.VolumeMounts {
volMnt := v.Spec.VolumeMounts[i]
for j := range invalidPaths {
if volMnt.MountPath == invalidPaths[j] {
err := field.Invalid(field.NewPath("spec").Child("volumeMounts").Index(i).Child("mountPath"),
volMnt,
"conflicts with the mount path of one of the internally generated paths")
allErrs = append(allErrs, err)
}
}
if strings.HasPrefix(volMnt.MountPath, paths.CertsRoot) {
err := field.Invalid(field.NewPath("spec").Child("volumeMounts").Index(i).Child("mountPath"),
v.Spec.VolumeMounts[i].MountPath,
fmt.Sprintf("cannot shared the same path prefix as the certs root '%s'", paths.CertsRoot))
allErrs = append(allErrs, err)
}
}
return allErrs
}

func (v *VerticaDB) canUpdateScName(oldObj *VerticaDB) bool {
scMap := map[string]*Subcluster{}
for i := range oldObj.Spec.Subclusters {
Expand Down
19 changes: 19 additions & 0 deletions api/v1beta1/verticadb_webhook_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,11 @@
package v1beta1

import (
"fmt"

. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"github.com/vertica/vertica-kubernetes/pkg/paths"
v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
)
Expand Down Expand Up @@ -285,6 +288,22 @@ var _ = Describe("verticadb_webhook", func() {
vdb.Default()
Expect(vdb.Spec.Communal.Endpoint).Should(Equal(DefaultGCloudEndpoint))
})

It("should prevent volumeMount paths to use same path as internal mount points", func() {
vdb := createVDBHelper()
vdb.Spec.VolumeMounts = []v1.VolumeMount{
{MountPath: paths.LogPath}}
validateSpecValuesHaveErr(vdb, true)
vdb.Spec.VolumeMounts = []v1.VolumeMount{
{MountPath: vdb.Spec.Local.DataPath}}
validateSpecValuesHaveErr(vdb, true)
vdb.Spec.VolumeMounts = []v1.VolumeMount{
{MountPath: fmt.Sprintf("%s/my.cert", paths.CertsRoot)}}
validateSpecValuesHaveErr(vdb, true)
vdb.Spec.VolumeMounts = []v1.VolumeMount{
{MountPath: "/good/path"}}
validateSpecValuesHaveErr(vdb, false)
})
})

func createVDBHelper() *VerticaDB {
Expand Down
6 changes: 6 additions & 0 deletions changes/unreleased/Added-20211029-083036.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
kind: Added
body: Added the ability to speciy custom volume mounts for use within the Vertica
container.
time: 2021-10-29T08:30:36.097279509-04:00
custom:
Issue: "89"
11 changes: 6 additions & 5 deletions pkg/controllers/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,10 +75,10 @@ func buildHlSvc(nm types.NamespacedName, vdb *vapi.VerticaDB) *corev1.Service {
func buildVolumeMounts(vdb *vapi.VerticaDB) []corev1.VolumeMount {
volMnts := []corev1.VolumeMount{
{Name: vapi.LocalDataPVC, MountPath: paths.LocalDataPath},
{Name: vapi.LocalDataPVC, SubPath: paths.GetPVSubPath(vdb, "config"), MountPath: paths.ConfigPath},
{Name: vapi.LocalDataPVC, SubPath: paths.GetPVSubPath(vdb, "log"), MountPath: paths.LogPath},
{Name: vapi.LocalDataPVC, SubPath: paths.GetPVSubPath(vdb, "data"), MountPath: vdb.Spec.Local.DataPath},
{Name: vapi.LocalDataPVC, SubPath: paths.GetPVSubPath(vdb, "depot"), MountPath: vdb.Spec.Local.DepotPath},
{Name: vapi.LocalDataPVC, SubPath: vdb.GetPVSubPath("config"), MountPath: paths.ConfigPath},
{Name: vapi.LocalDataPVC, SubPath: vdb.GetPVSubPath("log"), MountPath: paths.LogPath},
{Name: vapi.LocalDataPVC, SubPath: vdb.GetPVSubPath("data"), MountPath: vdb.Spec.Local.DataPath},
{Name: vapi.LocalDataPVC, SubPath: vdb.GetPVSubPath("depot"), MountPath: vdb.Spec.Local.DepotPath},
{Name: vapi.PodInfoMountName, MountPath: paths.PodInfoPath},
}

Expand All @@ -97,6 +97,7 @@ func buildVolumeMounts(vdb *vapi.VerticaDB) []corev1.VolumeMount {
}

volMnts = append(volMnts, buildCertSecretVolumeMounts(vdb)...)
volMnts = append(volMnts, vdb.Spec.VolumeMounts...)

return volMnts
}
Expand Down Expand Up @@ -291,7 +292,7 @@ func makeContainers(vdb *vapi.VerticaDB, sc *vapi.Subcluster) []corev1.Container
// prior to the creation of the VerticaDB.
c.VolumeMounts = append(c.VolumeMounts, buildVolumeMounts(vdb)...)
// As a convenience, add the database path as an environment variable.
c.Env = append(c.Env, corev1.EnvVar{Name: "DBPATH", Value: paths.GetDBDataPath(vdb)})
c.Env = append(c.Env, corev1.EnvVar{Name: "DBPATH", Value: vdb.GetDBDataPath()})
cnts = append(cnts, c)
}
return cnts
Expand Down
6 changes: 3 additions & 3 deletions pkg/controllers/createdb_reconcile.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,12 +92,12 @@ func (c *CreateDBReconciler) execCmd(ctx context.Context, atPod types.Namespaced

case isBucketNotExistError(stdout):
c.VRec.EVRec.Eventf(c.Vdb, corev1.EventTypeWarning, events.S3BucketDoesNotExist,
"The bucket in the S3 path '%s' does not exist", paths.GetCommunalPath(c.Vdb))
"The bucket in the S3 path '%s' does not exist", c.Vdb.GetCommunalPath())
return ctrl.Result{Requeue: true}, nil

case isCommunalPathNotEmpty(stdout):
c.VRec.EVRec.Eventf(c.Vdb, corev1.EventTypeWarning, events.CommunalPathIsNotEmpty,
"The communal path '%s' is not empty", paths.GetCommunalPath(c.Vdb))
"The communal path '%s' is not empty", c.Vdb.GetCommunalPath())
return ctrl.Result{Requeue: true}, nil

case isWrongRegion(stdout):
Expand Down Expand Up @@ -198,7 +198,7 @@ func (c *CreateDBReconciler) genCmd(ctx context.Context, hostList []string) ([]s
"-t", "create_db",
"--skip-fs-checks",
"--hosts=" + strings.Join(hostList, ","),
"--communal-storage-location=" + paths.GetCommunalPath(c.Vdb),
"--communal-storage-location=" + c.Vdb.GetCommunalPath(),
"--communal-storage-params=" + paths.AuthParmsFile,
"--sql=" + PostDBCreateSQLFile,
fmt.Sprintf("--shard-count=%d", c.Vdb.Spec.ShardCount),
Expand Down
2 changes: 1 addition & 1 deletion pkg/controllers/install_reconcile.go
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ func (d *InstallReconciler) fetchCompat21NodeNum(ctx context.Context, pf *PodFac
func (d *InstallReconciler) genCmdCreateInstallIndicator(compat21Node string) []string {
// The install indicator file has the UID of the vdb. This allows us to know
// that we are working with a different life in the vdb is ever recreated.
return []string{"bash", "-c", fmt.Sprintf("echo %s > %s", compat21Node, paths.GenInstallerIndicatorFileName(d.Vdb))}
return []string{"bash", "-c", fmt.Sprintf("echo %s > %s", compat21Node, d.Vdb.GenInstallerIndicatorFileName())}
}

// genCmdRemoveOldConfig generates the command to remove the old admintools.conf file
Expand Down
6 changes: 3 additions & 3 deletions pkg/controllers/install_reconcile_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ var _ = Describe("k8s/install_reconcile_test", func() {
fpr := &cmds.FakePodRunner{Results: cmds.CmdResults{
names.GenPodName(vdb, sc, 0): []cmds.CmdResult{{}},
names.GenPodName(vdb, sc, 1): []cmds.CmdResult{
{Stderr: "cat: " + paths.GenInstallerIndicatorFileName(vdb) + ": No such file or directory",
{Stderr: "cat: " + vdb.GenInstallerIndicatorFileName() + ": No such file or directory",
Err: errors.New("command terminated with exit code 1")},
},
names.GenPodName(vdb, sc, 2): []cmds.CmdResult{{}},
Expand Down Expand Up @@ -94,10 +94,10 @@ var _ = Describe("k8s/install_reconcile_test", func() {
fpr := &cmds.FakePodRunner{Results: cmds.CmdResults{
names.GenPodName(vdb, sc, 0): []cmds.CmdResult{{}},
names.GenPodName(vdb, sc, 1): []cmds.CmdResult{{
Stderr: "cat: " + paths.GenInstallerIndicatorFileName(vdb) + ": No such file or directory",
Stderr: "cat: " + vdb.GenInstallerIndicatorFileName() + ": No such file or directory",
Err: errors.New("command terminated with exit code 1")}},
names.GenPodName(vdb, sc, 2): []cmds.CmdResult{{
Stderr: "cat: " + paths.GenInstallerIndicatorFileName(vdb) + ": No such file or directory",
Stderr: "cat: " + vdb.GenInstallerIndicatorFileName() + ": No such file or directory",
Err: errors.New("command terminated with exit code 1")}},
}}

Expand Down
4 changes: 2 additions & 2 deletions pkg/controllers/paths.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ import (
// This step is necessary because of a lack of cleanup in admintools if any of
// these commands fail.
func cleanupLocalFiles(ctx context.Context, vdb *vapi.VerticaDB, prunner cmds.PodRunner, podName types.NamespacedName) error {
locPaths := []string{paths.GetDBDataPath(vdb), paths.GetDepotPath(vdb)}
locPaths := []string{vdb.GetDBDataPath(), vdb.GetDepotPath()}
for _, path := range locPaths {
cmd := []string{"rm", "-r", path}

Expand Down Expand Up @@ -72,7 +72,7 @@ func debugDumpAdmintoolsConfForPods(ctx context.Context, prunner cmds.PodRunner,
// handle the depot directory.
func changeDepotPermissions(ctx context.Context, vdb *vapi.VerticaDB, prunner cmds.PodRunner, podList []*PodFact) error {
cmd := []string{
"sudo", "chown", "dbadmin:verticadba", "-R", fmt.Sprintf("%s/%s", paths.LocalDataPath, paths.GetPVSubPath(vdb, "depot")),
"sudo", "chown", "dbadmin:verticadba", "-R", fmt.Sprintf("%s/%s", paths.LocalDataPath, vdb.GetPVSubPath("depot")),
}
for _, pod := range podList {
if _, _, err := prunner.ExecInPod(ctx, pod.name, names.ServerContainer, cmd...); err != nil {
Expand Down
4 changes: 2 additions & 2 deletions pkg/controllers/podfacts.go
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ func (p *PodFacts) checkIsInstalled(ctx context.Context, vdb *vapi.VerticaDB, pf
return nil
}

fn := paths.GenInstallerIndicatorFileName(vdb)
fn := vdb.GenInstallerIndicatorFileName()
if stdout, stderr, err := p.PRunner.ExecInPod(ctx, pf.name, names.ServerContainer, "cat", fn); err != nil {
if !strings.Contains(stderr, "cat: "+fn+": No such file or directory") {
return err
Expand Down Expand Up @@ -316,7 +316,7 @@ func (p *PodFacts) checkIsDBCreated(ctx context.Context, vdb *vapi.VerticaDB, pf
cmd := []string{
"bash",
"-c",
fmt.Sprintf("ls -d %s/v_%s_node????_data", paths.GetDBDataPath(vdb), vdb.Spec.DBName),
fmt.Sprintf("ls -d %s/v_%s_node????_data", vdb.GetDBDataPath(), vdb.Spec.DBName),
}
if stdout, stderr, err := p.PRunner.ExecInPod(ctx, pf.name, names.ServerContainer, cmd...); err != nil {
if !strings.Contains(stderr, "No such file or directory") {
Expand Down
3 changes: 1 addition & 2 deletions pkg/controllers/podfacts_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ import (
vapi "github.com/vertica/vertica-kubernetes/api/v1beta1"
"github.com/vertica/vertica-kubernetes/pkg/cmds"
"github.com/vertica/vertica-kubernetes/pkg/names"
"github.com/vertica/vertica-kubernetes/pkg/paths"
appsv1 "k8s.io/api/apps/v1"
"k8s.io/apimachinery/pkg/types"
"yunion.io/x/pkg/tristate"
Expand All @@ -51,7 +50,7 @@ var _ = Describe("podfacts", func() {
defer deletePods(ctx, vdb)

sc := &vdb.Spec.Subclusters[0]
installIndFn := paths.GenInstallerIndicatorFileName(vdb)
installIndFn := vdb.GenInstallerIndicatorFileName()
fpr := &cmds.FakePodRunner{Results: cmds.CmdResults{
names.GenPodName(vdb, sc, 0): []cmds.CmdResult{
{Stderr: "cat: " + installIndFn + ": No such file or directory", Err: errors.New("file not found")},
Expand Down
8 changes: 4 additions & 4 deletions pkg/controllers/revivedb_reconcile.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,12 +80,12 @@ func (r *ReviveDBReconciler) execCmd(ctx context.Context, atPod types.Namespaced
case isClusterLeaseNotExpired(stdout):
r.VRec.EVRec.Eventf(r.Vdb, corev1.EventTypeWarning, events.ReviveDBClusterInUse,
"revive_db failed because the cluster lease has not expired for '%s'",
paths.GetCommunalPath(r.Vdb))
r.Vdb.GetCommunalPath())
return ctrl.Result{Requeue: true}, nil

case isBucketNotExistError(stdout):
r.VRec.EVRec.Eventf(r.Vdb, corev1.EventTypeWarning, events.S3BucketDoesNotExist,
"The bucket in the S3 path '%s' does not exist", paths.GetCommunalPath(r.Vdb))
"The bucket in the S3 path '%s' does not exist", r.Vdb.GetCommunalPath())
return ctrl.Result{Requeue: true}, nil

case isEndpointBadError(stdout):
Expand All @@ -96,7 +96,7 @@ func (r *ReviveDBReconciler) execCmd(ctx context.Context, atPod types.Namespaced
case isDatabaseNotFound(stdout):
r.VRec.EVRec.Eventf(r.Vdb, corev1.EventTypeWarning, events.ReviveDBNotFound,
"revive_db failed because the database '%s' could not be found in the communal path '%s'",
r.Vdb.Spec.DBName, paths.GetCommunalPath(r.Vdb))
r.Vdb.Spec.DBName, r.Vdb.GetCommunalPath())
return ctrl.Result{Requeue: true}, nil

case isPermissionDeniedError(stdout):
Expand Down Expand Up @@ -226,7 +226,7 @@ func (r *ReviveDBReconciler) genCmd(ctx context.Context, hostList []string) ([]s
cmd := []string{
"-t", "revive_db",
"--hosts=" + strings.Join(hostList, ","),
"--communal-storage-location=" + paths.GetCommunalPath(r.Vdb),
"--communal-storage-location=" + r.Vdb.GetCommunalPath(),
"--communal-storage-params=" + paths.AuthParmsFile,
"--database", r.Vdb.Spec.DBName,
}
Expand Down
3 changes: 1 addition & 2 deletions pkg/controllers/uninstall_reconcile.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ import (
"github.com/vertica/vertica-kubernetes/pkg/atconf"
"github.com/vertica/vertica-kubernetes/pkg/cmds"
"github.com/vertica/vertica-kubernetes/pkg/names"
"github.com/vertica/vertica-kubernetes/pkg/paths"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
)
Expand Down Expand Up @@ -181,5 +180,5 @@ func (s *UninstallReconciler) findPodsSuitableForScaleDown(sc *vapi.Subcluster,

// genCmdRemoveInstallIndicator will generate the command to get rid of the installer indicator file
func (s *UninstallReconciler) genCmdRemoveInstallIndicator() []string {
return []string{"rm", paths.GenInstallerIndicatorFileName(s.Vdb)}
return []string{"rm", s.Vdb.GenInstallerIndicatorFileName()}
}
Loading

0 comments on commit 94a5009

Please sign in to comment.