Skip to content

Commit

Permalink
Fix RepositoryServer datamover tests (#2249)
Browse files Browse the repository at this point in the history
* Delete Namespace instead of deleting resources

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

* Add dynamic repository server address support

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

* Refactor imports

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

* Fix Lint Issues

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

---------

Signed-off-by: Rajat Gupta <rajat.gupta@veeam.com>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
  • Loading branch information
r4rajat and mergify[bot] committed Aug 10, 2023
1 parent 04fbe86 commit ae250ce
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 61 deletions.
53 changes: 20 additions & 33 deletions pkg/datamover/repository_server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import (
"fmt"
"os/exec"
"path/filepath"
"strconv"

. "gopkg.in/check.v1"
corev1 "k8s.io/api/core/v1"
Expand All @@ -39,6 +40,7 @@ import (

type RepositoryServerSuite struct {
namespace *corev1.Namespace
envSecret *corev1.Secret
pod *corev1.Pod
service *corev1.Service
ctx context.Context
Expand Down Expand Up @@ -116,39 +118,47 @@ func (rss *RepositoryServerSuite) SetUpSuite(c *C) {
func (rss *RepositoryServerSuite) setupKopiaRepositoryServer(c *C) {
var err error

// Setup Repository Server Address dynamically
repositoryServerAddressPort := rand.IntnRange(50000, 60000)
serverAddress := fmt.Sprintf("https://0.0.0.0:%s", strconv.Itoa(repositoryServerAddressPort))

// Create Test ConfigMap
rss.envSecret, err = createRepositoryServerTestPodEnvSecret(rss.ctx, rss.cli, rss.namespace.GetName())
c.Assert(err, IsNil)

// Create Test Pod
rss.pod, err = createRepositoryServerTestPod(rss.ctx, rss.cli, rss.namespace.GetName(), rss.tlsSecret)
rss.pod, err = createRepositoryServerTestPod(rss.ctx, rss.cli, rss.namespace.GetName(), rss.envSecret.GetName(), repositoryServerAddressPort, rss.tlsSecret)
c.Assert(err, IsNil)

// Wait for Test Pod to get Ready
c.Assert(kube.WaitForPodReady(rss.ctx, rss.cli, rss.namespace.GetName(), rss.pod.Name), IsNil)

// Create Test Service
rss.service, err = createRepositoryServerTestService(rss.ctx, rss.cli, rss.namespace.GetName())
rss.service, err = createRepositoryServerTestService(rss.ctx, rss.cli, rss.namespace.GetName(), repositoryServerAddressPort)
c.Assert(err, IsNil)

// Configure and Create Kopia Repository
err = createTestKopiaRepository(rss.s3Location, rss.cli, rss.namespace.GetName(), rss.pod)
c.Assert(err, IsNil)

// Start Kopia Repository Server
err = startTestKopiaRepositoryServer(rss.cli, rss.namespace.GetName(), rss.pod)
err = startTestKopiaRepositoryServer(rss.cli, rss.namespace.GetName(), serverAddress, rss.pod)
c.Assert(err, IsNil)

// Wait for Kopia Repository Server To Get Ready
err = waitForServerReady(rss.ctx, rss.cli, rss.namespace.GetName(), rss.pod, rss.tlsSecret)
err = waitForServerReady(rss.ctx, rss.cli, rss.namespace.GetName(), serverAddress, rss.pod, rss.tlsSecret)
c.Assert(err, IsNil)

// Add Test Client User in Kopia Repository
err = addTestUserInKopiaRepositoryServer(rss.cli, rss.namespace.GetName(), rss.pod, rss.user)
c.Assert(err, IsNil)

// Refresh Kopia Repository Server
err = refreshTestKopiaRepositoryServer(rss.ctx, rss.cli, rss.namespace.GetName(), rss.pod, rss.tlsSecret)
err = refreshTestKopiaRepositoryServer(rss.ctx, rss.cli, rss.namespace.GetName(), serverAddress, rss.pod, rss.tlsSecret)
c.Assert(err, IsNil)

// Wait for Kopia Repository Server To Get Ready
err = waitForServerReady(rss.ctx, rss.cli, rss.namespace.GetName(), rss.pod, rss.tlsSecret)
err = waitForServerReady(rss.ctx, rss.cli, rss.namespace.GetName(), serverAddress, rss.pod, rss.tlsSecret)
c.Assert(err, IsNil)
}

Expand Down Expand Up @@ -201,32 +211,9 @@ func (rss *RepositoryServerSuite) TestLocationOperationsForRepositoryServerDataM
}

func (rss *RepositoryServerSuite) TearDownSuite(c *C) {
// Delete Secrets
rss.cleanupTestSecrets(c)

// Delete Service
err := rss.cli.CoreV1().Services(rss.namespace.GetName()).Delete(rss.ctx, rss.service.GetName(), metav1.DeleteOptions{})
c.Assert(err, IsNil)

// Delete Test Pod
err = rss.cli.CoreV1().Pods(rss.namespace.GetName()).Delete(rss.ctx, rss.pod.GetName(), metav1.DeleteOptions{})
c.Assert(err, IsNil)

// Delete Namespace
err = rss.cli.CoreV1().Namespaces().Delete(rss.ctx, rss.namespace.GetName(), metav1.DeleteOptions{})
c.Assert(err, IsNil)
}

func (rss *RepositoryServerSuite) cleanupTestSecrets(c *C) {
err := rss.cli.CoreV1().Secrets(rss.namespace.GetName()).Delete(rss.ctx, rss.tlsSecret.GetName(), metav1.DeleteOptions{})
c.Assert(err, IsNil)

err = rss.cli.CoreV1().Secrets(rss.namespace.GetName()).Delete(rss.ctx, rss.userAccessSecret.GetName(), metav1.DeleteOptions{})
c.Assert(err, IsNil)

err = rss.cli.CoreV1().Secrets(rss.namespace.GetName()).Delete(rss.ctx, rss.s3Creds.GetName(), metav1.DeleteOptions{})
c.Assert(err, IsNil)

err = rss.cli.CoreV1().Secrets(rss.namespace.GetName()).Delete(rss.ctx, rss.s3Location.GetName(), metav1.DeleteOptions{})
c.Assert(err, IsNil)
if rss.namespace.GetName() != "" {
err := rss.cli.CoreV1().Namespaces().Delete(rss.ctx, rss.namespace.GetName(), metav1.DeleteOptions{})
c.Assert(err, IsNil)
}
}
65 changes: 37 additions & 28 deletions pkg/datamover/testutils.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ import (

const (
repositoryServerTestNamespace = "repository-server-test-namespace-"
repositoryServerTestPodEnvSecret = "repository-server-test-pod-env-secret-"
repositoryServerTestPod = "repository-server-test-pod-"
repositoryServerTestService = "repository-server-test-service-"
defaultKopiaRepositoryPassword = "test1234"
Expand Down Expand Up @@ -68,7 +69,24 @@ func createRepositoryServerTestNamespace(ctx context.Context, cli kubernetes.Int
return nsCreated, nil
}

func createRepositoryServerTestPod(ctx context.Context, cli kubernetes.Interface, namespace string, secret *corev1.Secret) (*corev1.Pod, error) {
func createRepositoryServerTestPodEnvSecret(ctx context.Context, cli kubernetes.Interface, namespace string) (*corev1.Secret, error) {
secret := &corev1.Secret{
ObjectMeta: metav1.ObjectMeta{
GenerateName: repositoryServerTestPodEnvSecret,
Namespace: namespace,
},
Type: corev1.SecretTypeOpaque,
Data: map[string][]byte{
awsconfig.AccessKeyID: []byte(os.Getenv(testutil.S3CompliantAccessKeyIDEnv)),
awsconfig.SecretAccessKey: []byte(os.Getenv(testutil.S3CompliantSecretAccessKeyEnv)),
awsconfig.Region: []byte(testutil.TestS3Region),
"LOCATION_ENDPOINT": []byte(os.Getenv(testutil.S3CompliantLocationEndpointEnv)),
},
}
return cli.CoreV1().Secrets(namespace).Create(ctx, secret, metav1.CreateOptions{})
}

func createRepositoryServerTestPod(ctx context.Context, cli kubernetes.Interface, namespace, envSecret string, port int, secret *corev1.Secret) (*corev1.Pod, error) {
pod := &corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
GenerateName: repositoryServerTestPod,
Expand All @@ -82,26 +100,17 @@ func createRepositoryServerTestPod(ctx context.Context, cli kubernetes.Interface
Image: consts.LatestKanisterToolsImage,
Ports: []corev1.ContainerPort{
{
HostPort: 51515,
ContainerPort: 51515,
HostPort: int32(port),
ContainerPort: int32(port),
},
},
Env: []corev1.EnvVar{
{
Name: awsconfig.AccessKeyID,
Value: os.Getenv(testutil.S3CompliantAccessKeyIDEnv),
},
{
Name: awsconfig.SecretAccessKey,
Value: os.Getenv(testutil.S3CompliantSecretAccessKeyEnv),
},
{
Name: awsconfig.Region,
Value: testutil.TestS3Region,
},
EnvFrom: []corev1.EnvFromSource{
{
Name: "LOCATION_ENDPOINT",
Value: os.Getenv(testutil.S3CompliantLocationEndpointEnv),
SecretRef: &corev1.SecretEnvSource{
LocalObjectReference: corev1.LocalObjectReference{
Name: envSecret,
},
},
},
},
VolumeMounts: []corev1.VolumeMount{
Expand Down Expand Up @@ -133,7 +142,7 @@ func createRepositoryServerTestPod(ctx context.Context, cli kubernetes.Interface
return podCreated, nil
}

func createRepositoryServerTestService(ctx context.Context, cli kubernetes.Interface, namespace string) (*corev1.Service, error) {
func createRepositoryServerTestService(ctx context.Context, cli kubernetes.Interface, namespace string, port int) (*corev1.Service, error) {
name := fmt.Sprintf("%s%s", repositoryServerTestService, rand.String(5))

service := &corev1.Service{
Expand All @@ -152,7 +161,7 @@ func createRepositoryServerTestService(ctx context.Context, cli kubernetes.Inter
Port: 51515,
// Selects Random Port from NodePort Range
NodePort: int32(rand.IntnRange(30000, 32767)),
TargetPort: intstr.FromInt(51515),
TargetPort: intstr.FromInt(port),
},
},
},
Expand Down Expand Up @@ -192,15 +201,15 @@ func createTestKopiaRepository(location *corev1.Secret, cli kubernetes.Interface
)
}

func startTestKopiaRepositoryServer(cli kubernetes.Interface, namespace string, pod *corev1.Pod) error {
func startTestKopiaRepositoryServer(cli kubernetes.Interface, namespace, serverAddress string, pod *corev1.Pod) error {
cmd := kopiacmd.ServerStart(
kopiacmd.ServerStartCommandArgs{
CommandArgs: &kopiacmd.CommandArgs{
RepoPassword: "",
ConfigFilePath: kopiacmd.DefaultConfigFilePath,
LogDirectory: kopiacmd.DefaultLogDirectory,
},
ServerAddress: "https://0.0.0.0:51515",
ServerAddress: serverAddress,
TLSCertFile: testTLSCertPath,
TLSKeyFile: testTLSKeyPath,
ServerUsername: testKopiaRepoServerAdminUsername,
Expand All @@ -218,7 +227,7 @@ func startTestKopiaRepositoryServer(cli kubernetes.Interface, namespace string,
return nil
}

func getServerStatusCommand(ctx context.Context, cli kubernetes.Interface, namespace string, tlsSecret *corev1.Secret) ([]string, error) {
func getServerStatusCommand(ctx context.Context, cli kubernetes.Interface, namespace, serverAddress string, tlsSecret *corev1.Secret) ([]string, error) {
fingerprint, err := kopia.ExtractFingerprintFromCertSecret(ctx, cli, tlsSecret.GetName(), namespace)
if err != nil {
return nil, errors.Wrap(err, "Error Extracting Fingerprint from the TLS Certificates")
Expand All @@ -231,16 +240,16 @@ func getServerStatusCommand(ctx context.Context, cli kubernetes.Interface, names
ConfigFilePath: kopiacmd.DefaultConfigFilePath,
LogDirectory: kopiacmd.DefaultLogDirectory,
},
ServerAddress: "https://0.0.0.0:51515",
ServerAddress: serverAddress,
ServerUsername: testKopiaRepoServerAdminUsername,
ServerPassword: testKopiaRepoServerAdminPassword,
Fingerprint: fingerprint,
})
return cmd, nil
}

func waitForServerReady(ctx context.Context, cli kubernetes.Interface, namespace string, pod *corev1.Pod, tlsSecret *corev1.Secret) error {
cmd, err := getServerStatusCommand(ctx, cli, namespace, tlsSecret)
func waitForServerReady(ctx context.Context, cli kubernetes.Interface, namespace, serverAddress string, pod *corev1.Pod, tlsSecret *corev1.Secret) error {
cmd, err := getServerStatusCommand(ctx, cli, namespace, serverAddress, tlsSecret)
if err != nil {
return errors.Wrap(err, "Error Getting Server Status Command")
}
Expand Down Expand Up @@ -272,7 +281,7 @@ func addTestUserInKopiaRepositoryServer(cli kubernetes.Interface, namespace stri
return nil
}

func refreshTestKopiaRepositoryServer(ctx context.Context, cli kubernetes.Interface, namespace string, pod *corev1.Pod, tlsSecret *corev1.Secret) error {
func refreshTestKopiaRepositoryServer(ctx context.Context, cli kubernetes.Interface, namespace, serverAddress string, pod *corev1.Pod, tlsSecret *corev1.Secret) error {
fingerprint, err := kopia.ExtractFingerprintFromCertSecret(ctx, cli, tlsSecret.GetName(), namespace)
if err != nil {
return errors.Wrap(err, "Error Extracting Fingerprint from the TLS Certificates")
Expand All @@ -285,7 +294,7 @@ func refreshTestKopiaRepositoryServer(ctx context.Context, cli kubernetes.Interf
ConfigFilePath: kopiacmd.DefaultConfigFilePath,
LogDirectory: kopiacmd.DefaultLogDirectory,
},
ServerAddress: "https://0.0.0.0:51515",
ServerAddress: serverAddress,
ServerUsername: testKopiaRepoServerAdminUsername,
ServerPassword: testKopiaRepoServerAdminPassword,
Fingerprint: fingerprint,
Expand Down

0 comments on commit ae250ce

Please sign in to comment.