Skip to content

Commit

Permalink
Generic Project Test Cases - qa-task-1248
Browse files Browse the repository at this point in the history
  • Loading branch information
Priyashetty17 committed May 9, 2024
1 parent 0b9e86c commit d61d3f0
Show file tree
Hide file tree
Showing 5 changed files with 528 additions and 96 deletions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ require (
github.com/antihax/optional v1.0.0
github.com/containers/image/v5 v5.26.0
github.com/rancher/rancher/pkg/apis v0.0.0-20240425061024-5ce684a45887
github.com/rancher/shepherd v0.0.0-20240502220002-2bcb20d8aa61
github.com/rancher/shepherd v0.0.0-20240509211228-da95733916b0
go.qase.io/client v0.0.0-20231114201952-65195ec001fa
)

Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -1700,8 +1700,8 @@ github.com/rancher/remotedialer v0.3.0 h1:y1EO8JCsgZo0RcqTUp6U8FXcBAv27R+TLnWRcp
github.com/rancher/remotedialer v0.3.0/go.mod h1:BwwztuvViX2JrLLUwDlsYt5DiyUwHLlzynRwkZLAY0Q=
github.com/rancher/rke v1.6.0-rc1 h1:4aYfGiG4gxL5k44M3jpDoKfQqI1lxdl4GAVPRMvKMj8=
github.com/rancher/rke v1.6.0-rc1/go.mod h1:vojhOf8U8VCmw7y17OENWXSIfEFPEbXCMQcmI7xN7i8=
github.com/rancher/shepherd v0.0.0-20240502220002-2bcb20d8aa61 h1:w+zEBdP+7gGv+bKqqiSjeVjM6Mm5IjXN8tP1PGSJAS0=
github.com/rancher/shepherd v0.0.0-20240502220002-2bcb20d8aa61/go.mod h1:Mpd+RsxaqTMaoKSdeiEvGoDEknAKS8hAWjdozi5mJxE=
github.com/rancher/shepherd v0.0.0-20240509211228-da95733916b0 h1:pBpAk+hoBSSOuoA4PLynH9WA9AD9aAWEMvBv1efBHgo=
github.com/rancher/shepherd v0.0.0-20240509211228-da95733916b0/go.mod h1:Mpd+RsxaqTMaoKSdeiEvGoDEknAKS8hAWjdozi5mJxE=
github.com/rancher/steve v0.0.0-20240314145706-870824dc8f49 h1:FVWzTCgR2bRcKIWqgJCa7L4s8J1S8HfCJMnqoSj99yg=
github.com/rancher/steve v0.0.0-20240314145706-870824dc8f49/go.mod h1:+MET7wv8z6yycUt6NRDQzrd+h/j91tumImDg29w7eTw=
github.com/rancher/system-upgrade-controller/pkg/apis v0.0.0-20210727200656-10b094e30007 h1:ru+mqGnxMmKeU0Q3XIDxkARvInDIqT1hH2amTcsjxI4=
Expand Down
190 changes: 161 additions & 29 deletions tests/v2/validation/projects/projects.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,29 +11,76 @@ import (
"github.com/rancher/shepherd/clients/rancher"
management "github.com/rancher/shepherd/clients/rancher/generated/management/v3"
"github.com/rancher/shepherd/extensions/defaults"
projectsApi "github.com/rancher/shepherd/extensions/kubeapi/projects"
rbacApi "github.com/rancher/shepherd/extensions/kubeapi/rbac"
"github.com/rancher/shepherd/extensions/kubeapi/namespaces"
"github.com/rancher/shepherd/extensions/kubeapi/projects"
"github.com/rancher/shepherd/extensions/kubeapi/rbac"
"github.com/rancher/shepherd/extensions/kubeapi/workloads/deployments"
"github.com/rancher/shepherd/extensions/kubeconfig"
"github.com/rancher/shepherd/extensions/workloads"
namegen "github.com/rancher/shepherd/pkg/namegenerator"
appv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
kwait "k8s.io/apimachinery/pkg/util/wait"
)

const (
dummyFinalizer = "dummy"
timeFormat = "2006/01/02 15:04:05"
roleProjectOwner = "project-owner"
roleOwner = "cluster-owner"
dummyFinalizer = "dummy"
timeFormat = "2006/01/02 15:04:05"
projectOwner = "project-owner"
clusterOwner = "cluster-owner"
clusterMember = "cluster-member"
systemProjectName = "System"
namespaceSteveType = "namespace"
resourceQuotaAnnotation = "field.cattle.io/resourceQuota"
containerDefaultLimitAnnotation = "field.cattle.io/containerDefaultResourceLimit"
resourceQuotaStatusAnnotation = "cattle.io/status"
containerName = "nginx"
imageName = "nginx"
)

var resourceQuotaLimit = v3.ResourceQuotaLimit{
Pods: "",
Services: "",
ReplicationControllers: "",
Secrets: "",
ConfigMaps: "",
PersistentVolumeClaims: "",
ServicesNodePorts: "",
ServicesLoadBalancers: "",
RequestsCPU: "",
RequestsMemory: "",
RequestsStorage: "",
LimitsCPU: "",
LimitsMemory: "",
}

var resourceQuota = &v3.ProjectResourceQuota{
Limit: resourceQuotaLimit,
}

var namespaceResourceQuota = v3.NamespaceResourceQuota{
Limit: resourceQuotaLimit,
}

var containerResourceLimit = v3.ContainerResourceLimit{
RequestsCPU: "",
RequestsMemory: "",
LimitsCPU: "",
LimitsMemory: "",
}

var project = v3.Project{
ObjectMeta: metav1.ObjectMeta{
Name: "",
Namespace: "",
Finalizers: []string{},
},
Spec: v3.ProjectSpec{
ClusterName: "",
ClusterName: "",
ResourceQuota: resourceQuota,
NamespaceDefaultResourceQuota: &namespaceResourceQuota,
ContainerDefaultResourceLimit: &containerResourceLimit,
},
}

Expand All @@ -47,37 +94,86 @@ var prtb = v3.ProjectRoleTemplateBinding{
UserPrincipalName: "",
}

func createProject(client *rancher.Client, clusterName string) (*v3.Project, error) {
func createProject(client *rancher.Client, clusterID string, namespacePodLimit, projectPodLimit, cpuLimit, cpuReservation, memoryLimit, memoryReservation string) (*v3.Project, error) {
project.Name = namegen.AppendRandomString("testproject")
project.Namespace = clusterName
project.Spec.ClusterName = clusterName
createdProject, err := projectsApi.CreateProject(client, &project)
project.Namespace = clusterID
project.Spec.ClusterName = clusterID
project.Spec.NamespaceDefaultResourceQuota.Limit.Pods = namespacePodLimit
project.Spec.ResourceQuota.Limit.Pods = projectPodLimit
project.Spec.ContainerDefaultResourceLimit.LimitsCPU = cpuLimit
project.Spec.ContainerDefaultResourceLimit.RequestsCPU = cpuReservation
project.Spec.ContainerDefaultResourceLimit.LimitsMemory = memoryLimit
project.Spec.ContainerDefaultResourceLimit.RequestsMemory = memoryReservation

createdProject, err := client.WranglerContext.Mgmt.Project().Create(&project)
if err != nil {
return nil, err
}

return createdProject, nil
}

func createProjectAndNamespace(client *rancher.Client, clusterID string, namespacePodLimit, projectPodLimit, cpuLimit, cpuReservation, memoryLimit, memoryReservation string) (*v3.Project, *corev1.Namespace, error) {
createdProject, err := createProject(client, clusterID, namespacePodLimit, projectPodLimit, cpuLimit, cpuReservation, memoryLimit, memoryReservation)
if err != nil {
return nil, nil, err
}

namespaceName := namegen.AppendRandomString("testns-")
createdNamespace, err := namespaces.CreateNamespace(client, clusterID, createdProject.Name, namespaceName, "", map[string]string{}, map[string]string{})
if err != nil {
return nil, nil, err
}

return createdProject, createdNamespace, nil
}

func createProjectRoleTemplateBinding(client *rancher.Client, user *management.User, project *v3.Project, role string) (*v3.ProjectRoleTemplateBinding, error) {
projectName := fmt.Sprintf("%s:%s", project.Namespace, project.Name)
prtb.Name = namegen.AppendRandomString("prtb-")
prtb.Namespace = project.Name
prtb.ProjectName = projectName
prtb.RoleTemplateName = role
prtb.UserPrincipalName = user.PrincipalIDs[0]
createdProjectRoleTemplateBinding, err := rbacApi.CreateProjectRoleTemplateBinding(client, &prtb)

createdProjectRoleTemplateBinding, err := rbac.CreateProjectRoleTemplateBinding(client, &prtb)
if err != nil {
return nil, err
}

return createdProjectRoleTemplateBinding, nil
}

func createDeployment(client *rancher.Client, clusterID string, namespace string, replicaCount int) (*appv1.Deployment, error) {
deploymentName := namegen.AppendRandomString("testdeployment")
containerTemplate := workloads.NewContainer(containerName, imageName, corev1.PullAlways, []corev1.VolumeMount{}, []corev1.EnvFromSource{}, nil, nil, nil)
podTemplate := workloads.NewPodTemplate([]corev1.Container{containerTemplate}, []corev1.Volume{}, []corev1.LocalObjectReference{}, nil)
replicas := int32(replicaCount)

deploymentObj, err := deployments.CreateDeployment(client, clusterID, deploymentName, namespace, podTemplate, replicas)
if err != nil {
return nil, err
}

return deploymentObj, nil
}

func updateProjectNamespaceFinalizer(client *rancher.Client, existingProject *v3.Project, finalizer []string) (*v3.Project, error) {
updatedProject := existingProject.DeepCopy()
updatedProject.ObjectMeta.Finalizers = finalizer

updatedProject, err := projects.UpdateProject(client, existingProject, updatedProject)
if err != nil {
return nil, err
}

return updatedProject, nil
}

func waitForFinalizerToUpdate(client *rancher.Client, projectName string, projectNamespace string, finalizerCount int) error {
err := kwait.Poll(defaults.FiveHundredMillisecondTimeout, defaults.TenSecondTimeout, func() (done bool, pollErr error) {
project, pollErr := projectsApi.ListProjects(client, project.Namespace, metav1.ListOptions{
FieldSelector: "metadata.name=" + project.Name,
project, pollErr := projects.ListProjects(client, projectNamespace, metav1.ListOptions{
FieldSelector: "metadata.name=" + projectName,
})
if pollErr != nil {
return false, pollErr
Expand All @@ -86,7 +182,7 @@ func waitForFinalizerToUpdate(client *rancher.Client, projectName string, projec
if len(project.Items[0].Finalizers) == finalizerCount {
return true, nil
}
return false, nil
return false, pollErr
})

if err != nil {
Expand All @@ -96,7 +192,55 @@ func waitForFinalizerToUpdate(client *rancher.Client, projectName string, projec
return nil
}

func checkPodLogsForErrors(client *rancher.Client, cluster string, podName string, namespace string, errorPattern string, startTime time.Time) error {
func checkAnnotationExistsInNamespace(client *rancher.Client, clusterID string, namespaceName string, annotationKey string, expectedExistence bool) error {
updatedNamespace, err := namespaces.GetNamespaceByName(client, clusterID, namespaceName)
if err != nil {
return err
}

_, exists := updatedNamespace.Annotations[annotationKey]
if (expectedExistence && !exists) || (!expectedExistence && exists) {
errorMessage := fmt.Sprintf("Annotation '%s' should%s exist", annotationKey, map[bool]string{true: "", false: " not"}[expectedExistence])
return errors.New(errorMessage)
}

return nil
}

func checkNamespaceLabelsAndAnnotations(clusterID string, projectName string, namespace *corev1.Namespace) error {
var errorMessages []string
expectedLabels := map[string]string{
projects.ProjectIDAnnotation: projectName,
}

expectedAnnotations := map[string]string{
projects.ProjectIDAnnotation: clusterID + ":" + projectName,
}

for key, value := range expectedLabels {
if _, ok := namespace.Labels[key]; !ok {
errorMessages = append(errorMessages, fmt.Sprintf("expected label %s not present in namespace labels", key))
} else if namespace.Labels[key] != value {
errorMessages = append(errorMessages, fmt.Sprintf("label value mismatch for %s: expected %s, got %s", key, value, namespace.Labels[key]))
}
}

for key, value := range expectedAnnotations {
if _, ok := namespace.Annotations[key]; !ok {
errorMessages = append(errorMessages, fmt.Sprintf("expected annotation %s not present in namespace annotations", key))
} else if namespace.Annotations[key] != value {
errorMessages = append(errorMessages, fmt.Sprintf("annotation value mismatch for %s: expected %s, got %s", key, value, namespace.Annotations[key]))
}
}

if len(errorMessages) > 0 {
return fmt.Errorf(strings.Join(errorMessages, "\n"))
}

return nil
}

func checkPodLogsForErrors(client *rancher.Client, clusterID string, podName string, namespace string, errorPattern string, startTime time.Time) error {
startTimeUTC := startTime.UTC()

errorRegex := regexp.MustCompile(errorPattern)
Expand All @@ -105,7 +249,7 @@ func checkPodLogsForErrors(client *rancher.Client, cluster string, podName strin
var errorMessage string

kwait.Poll(defaults.TenSecondTimeout, defaults.TwoMinuteTimeout, func() (bool, error) {
podLogs, err := kubeconfig.GetPodLogs(client, cluster, podName, namespace, "")
podLogs, err := kubeconfig.GetPodLogs(client, clusterID, podName, namespace, "")
if err != nil {
return false, err
}
Expand Down Expand Up @@ -137,15 +281,3 @@ func checkPodLogsForErrors(client *rancher.Client, cluster string, podName strin

return nil
}

func updateProjectNamespaceFinalizer(client *rancher.Client, existingProject *v3.Project, finalizer []string) (*v3.Project, error) {
updatedProject := existingProject.DeepCopy()
updatedProject.ObjectMeta.Finalizers = finalizer

updatedProject, err := projectsApi.UpdateProject(client, existingProject, updatedProject)
if err != nil {
return nil, err
}

return updatedProject, nil
}
Loading

0 comments on commit d61d3f0

Please sign in to comment.