mirror of
https://github.com/ceph/ceph-csi.git
synced 2024-12-18 11:00:25 +00:00
e2e: introduce ResourceDeployer interface
Signed-off-by: Niels de Vos <ndevos@redhat.com>
This commit is contained in:
parent
701b5d7ecb
commit
2b4bb63eb8
@ -20,6 +20,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"os"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
appsv1 "k8s.io/api/apps/v1"
|
appsv1 "k8s.io/api/apps/v1"
|
||||||
@ -178,3 +179,78 @@ func waitForDeploymentComplete(clientSet kubernetes.Interface, name, ns string,
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ResourceDeployer provides a generic interface for deploying different
|
||||||
|
// resources.
|
||||||
|
type ResourceDeployer interface {
|
||||||
|
// Do is used to create/delete a resource with kubectl.
|
||||||
|
Do(action kubectlAction) error
|
||||||
|
}
|
||||||
|
|
||||||
|
// yamlResource reads a YAML file and creates/deletes the resource with
|
||||||
|
// kubectl.
|
||||||
|
type yamlResource struct {
|
||||||
|
filename string
|
||||||
|
|
||||||
|
// allowMissing prevents a failure in case the file is missing.
|
||||||
|
allowMissing bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (yr *yamlResource) Do(action kubectlAction) error {
|
||||||
|
data, err := os.ReadFile(yr.filename)
|
||||||
|
if err != nil {
|
||||||
|
if os.IsNotExist(err) && yr.allowMissing {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Errorf("failed to read content from %q: %w", yr.filename, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = retryKubectlInput(cephCSINamespace, action, string(data), deployTimeout)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to %s resource %q: %w", action, yr.filename, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// yamlResourceNamespaced takes a filename and calls
|
||||||
|
// replaceNamespaceInTemplate() on it. There are several options for adjusting
|
||||||
|
// templates, each has their own comment.
|
||||||
|
type yamlResourceNamespaced struct {
|
||||||
|
filename string
|
||||||
|
namespace string
|
||||||
|
|
||||||
|
// set the number of replicas in a Deployment to 1.
|
||||||
|
oneReplica bool
|
||||||
|
|
||||||
|
// enable topology support (for RBD)
|
||||||
|
enableTopology bool
|
||||||
|
domainLabel string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (yrn *yamlResourceNamespaced) Do(action kubectlAction) error {
|
||||||
|
data, err := replaceNamespaceInTemplate(yrn.filename)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to read content from %q: %w", yrn.filename, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if yrn.oneReplica {
|
||||||
|
data = oneReplicaDeployYaml(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
if yrn.enableTopology {
|
||||||
|
data = enableTopologyInTemplate(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
if yrn.domainLabel != "" {
|
||||||
|
data = addTopologyDomainsToDSYaml(data, yrn.domainLabel)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = retryKubectlInput(yrn.namespace, action, data, deployTimeout)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to %s resource %q in namespace %q: %w", action, yrn.filename, yrn.namespace, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user