Skip to content

Commit

Permalink
Add NetworkPolicyRecommnedation restful handler
Browse files Browse the repository at this point in the history
Add unit-test

Signed-off-by: Yun-Tang Hsu <hsuy@vmware.com>
  • Loading branch information
yuntanghsu committed Oct 11, 2022
1 parent 995bf04 commit 6af945e
Show file tree
Hide file tree
Showing 5 changed files with 406 additions and 51 deletions.
27 changes: 9 additions & 18 deletions pkg/apis/intelligence/v1alpha1/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,6 @@ package v1alpha1

import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

const (
NPRecommendationJobInitial string = "Initial"
NPRecommendationJobSubsequent string = "Subsequent"
NPRecommendationStateNew string = "NEW"
NPRecommendationStateScheduled string = "SCHEDULED"
NPRecommendationStateRunning string = "RUNNING"
NPRecommendationStateCompleted string = "COMPLETED"
NPRecommendationStateFailed string = "FAILED"
)

// +genclient
// +genclient:nonNamespaced
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
Expand All @@ -51,14 +41,15 @@ type NetworkPolicyRecommendation struct {
}

type NetworkPolicyRecommendationStatus struct {
State string `json:"state,omitempty"`
SparkApplication string `json:"sparkApplication,omitempty"`
CompletedStages int `json:"completedStages,omitempty"`
TotalStages int `json:"totalStages,omitempty"`
RecommendationOutcome string `json:"recommendationOutcome,omitempty"`
CompletionTimestamp metav1.Time `json:"completionTimestamp,omitempty"`
ErrorCode string `json:"errorCode,omitempty"`
ErrorMsg string `json:"errorMsg,omitempty"`
State string `json:"state,omitempty"`
SparkApplication string `json:"sparkApplication,omitempty"`
CompletedStages int `json:"completedStages,omitempty"`
TotalStages int `json:"totalStages,omitempty"`
RecommendedNetworkPolicy string `json:"recommendedNetworkPolicy,omitempty"`
ErrorCode string `json:"errorCode,omitempty"`
ErrorMsg string `json:"errorMsg,omitempty"`
StartTime metav1.Time `json:"startTime,omitempty"`
EndTime metav1.Time `json:"endTime,omitempty"`
}

// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
Expand Down
3 changes: 2 additions & 1 deletion pkg/apis/intelligence/v1alpha1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,15 @@ package networkpolicyrecommendation

import (
"context"
"fmt"

"k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/apis/meta/internalversion"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apiserver/pkg/registry/rest"

crdv1alpha1 "antrea.io/theia/pkg/apis/crd/v1alpha1"
intelligence "antrea.io/theia/pkg/apis/intelligence/v1alpha1"
"antrea.io/theia/pkg/querier"
)
Expand All @@ -33,11 +35,15 @@ type REST struct {
}

var (
_ rest.Scoper = &REST{}
_ rest.Getter = &REST{}
_ rest.Lister = &REST{}
_ rest.Scoper = &REST{}
_ rest.Getter = &REST{}
_ rest.Lister = &REST{}
_ rest.Creater = &REST{}
_ rest.GracefulDeleter = &REST{}
)

const defaultNameSpace = "flow-visibility"

// NewREST returns a REST object that will work against API services.
func NewREST(nprq querier.NPRecommendationQuerier) *REST {
return &REST{npRecommendationQuerier: nprq}
Expand All @@ -47,44 +53,32 @@ func (r *REST) New() runtime.Object {
return &intelligence.NetworkPolicyRecommendation{}
}

func (r *REST) getNetworkPolicyRecommendation(name string) *intelligence.NetworkPolicyRecommendation {
npReco, err := r.npRecommendationQuerier.GetNetworkPolicyRecommendation("flow-visibility", name)
if err != nil {
return nil
}

job := new(intelligence.NetworkPolicyRecommendation)
job.Name = npReco.Name
job.Type = npReco.Spec.JobType
job.Limit = npReco.Spec.Limit
job.PolicyType = npReco.Spec.PolicyType
job.StartInterval = npReco.Spec.StartInterval
job.EndInterval = npReco.Spec.EndInterval
job.NSAllowList = npReco.Spec.NSAllowList
job.ExcludeLabels = npReco.Spec.ExcludeLabels
job.ToServices = npReco.Spec.ToServices
job.ExecutorInstances = npReco.Spec.ExecutorInstances
job.DriverCoreRequest = npReco.Spec.DriverCoreRequest
job.DriverMemory = npReco.Spec.DriverMemory
job.ExecutorCoreRequest = npReco.Spec.ExecutorCoreRequest
job.ExecutorMemory = npReco.Spec.ExecutorMemory
return job
}

func (r *REST) Get(ctx context.Context, name string, options *metav1.GetOptions) (runtime.Object, error) {
job := r.getNetworkPolicyRecommendation(name)
if job == nil {
npReco, err := r.npRecommendationQuerier.GetNetworkPolicyRecommendation(defaultNameSpace, name)
if err != nil {
return nil, errors.NewNotFound(intelligence.Resource("networkpolicyrecommendations"), name)
}
return job, nil
intelliNPR := new(intelligence.NetworkPolicyRecommendation)
r.copyNetworkPolicyRecommendation(intelliNPR, npReco)
return intelliNPR, nil
}

func (r *REST) NewList() runtime.Object {
return &intelligence.NetworkPolicyRecommendationList{}
}

func (r *REST) List(ctx context.Context, options *internalversion.ListOptions) (runtime.Object, error) {
list := new(intelligence.NetworkPolicyRecommendationList)
npRecoList, err := r.npRecommendationQuerier.ListNetworkPolicyRecommendation(defaultNameSpace)
if err != nil {
return nil, errors.NewBadRequest(fmt.Sprintf("error when getting NetworkPolicyRecommendationsList: %v", err))
}
items := make([]intelligence.NetworkPolicyRecommendation, 0, len(npRecoList))
for _, npReco := range npRecoList {
intelliNPR := new(intelligence.NetworkPolicyRecommendation)
r.copyNetworkPolicyRecommendation(intelliNPR, npReco)
items = append(items, *intelliNPR)
}
list := &intelligence.NetworkPolicyRecommendationList{Items: items}
return list, nil
}

Expand All @@ -95,3 +89,74 @@ func (r *REST) NamespaceScoped() bool {
func (r *REST) ConvertToTable(ctx context.Context, obj runtime.Object, tableOptions runtime.Object) (*metav1.Table, error) {
return rest.NewDefaultTableConvertor(intelligence.Resource("networkpolicyrecommendations")).ConvertToTable(ctx, obj, tableOptions)
}

func (r *REST) Create(ctx context.Context, obj runtime.Object, createValidation rest.ValidateObjectFunc, options *metav1.CreateOptions) (runtime.Object, error) {
npReco, ok := obj.(*intelligence.NetworkPolicyRecommendation)
if !ok {
return nil, errors.NewBadRequest(fmt.Sprintf("not a NetworkPolicyRecommendation object: %T", obj))
}
existNPReco, _ := r.npRecommendationQuerier.GetNetworkPolicyRecommendation(defaultNameSpace, npReco.Name)
if existNPReco != nil {
return nil, errors.NewBadRequest(fmt.Sprintf("networkPolicyRecommendation job exists, name: %s", npReco.Name))
}
job := new(crdv1alpha1.NetworkPolicyRecommendation)
job.Name = npReco.Name
job.Spec.JobType = npReco.Type
job.Spec.Limit = npReco.Limit
job.Spec.PolicyType = npReco.PolicyType
job.Spec.StartInterval = npReco.StartInterval
job.Spec.EndInterval = npReco.EndInterval
job.Spec.NSAllowList = npReco.NSAllowList
job.Spec.ExcludeLabels = npReco.ExcludeLabels
job.Spec.ToServices = npReco.ToServices
job.Spec.ExecutorInstances = npReco.ExecutorInstances
job.Spec.DriverCoreRequest = npReco.DriverCoreRequest
job.Spec.DriverMemory = npReco.DriverMemory
job.Spec.ExecutorCoreRequest = npReco.ExecutorCoreRequest
job.Spec.ExecutorMemory = npReco.ExecutorMemory
_, err := r.npRecommendationQuerier.CreateNetworkPolicyRecommendation(defaultNameSpace, job)
if err != nil {
return nil, errors.NewBadRequest(fmt.Sprintf("error when creating NetworkPolicyRecommendation CR: %v", err))
}
return &metav1.Status{Status: metav1.StatusSuccess}, nil
}

func (r *REST) Delete(ctx context.Context, name string, deleteValidation rest.ValidateObjectFunc, options *metav1.DeleteOptions) (runtime.Object, bool, error) {
_, err := r.npRecommendationQuerier.GetNetworkPolicyRecommendation(defaultNameSpace, name)
if err != nil {
return nil, false, errors.NewBadRequest(fmt.Sprintf("NetworkPolicyRecommendation job doesn't exist, name: %s", name))
}
err = r.npRecommendationQuerier.DeleteNetworkPolicyRecommendation(defaultNameSpace, name)
if err != nil {
return nil, false, err
}
return &metav1.Status{Status: metav1.StatusSuccess}, false, nil
}

// copyNetworkPolicyRecommendation is used to copy NetworkPolicyRecommendation from crd to intelligence
func (r *REST) copyNetworkPolicyRecommendation(intelli *intelligence.NetworkPolicyRecommendation, crd *crdv1alpha1.NetworkPolicyRecommendation) error {
intelli.Name = crd.Name
intelli.Type = crd.Spec.JobType
intelli.Limit = crd.Spec.Limit
intelli.PolicyType = crd.Spec.PolicyType
intelli.StartInterval = crd.Spec.StartInterval
intelli.EndInterval = crd.Spec.EndInterval
intelli.NSAllowList = crd.Spec.NSAllowList
intelli.ExcludeLabels = crd.Spec.ExcludeLabels
intelli.ToServices = crd.Spec.ToServices
intelli.ExecutorInstances = crd.Spec.ExecutorInstances
intelli.DriverCoreRequest = crd.Spec.DriverCoreRequest
intelli.DriverMemory = crd.Spec.DriverMemory
intelli.ExecutorCoreRequest = crd.Spec.ExecutorCoreRequest
intelli.ExecutorMemory = crd.Spec.ExecutorMemory
intelli.Status.State = crd.Status.State
intelli.Status.SparkApplication = crd.Status.SparkApplication
intelli.Status.CompletedStages = crd.Status.CompletedStages
intelli.Status.TotalStages = crd.Status.TotalStages
intelli.Status.RecommendedNetworkPolicy = crd.Status.RecommendedNP.Spec.Yamls
intelli.Status.ErrorMsg = crd.Status.ErrorMsg
// todo: need to parse the error code
intelli.Status.StartTime = crd.Status.StartTime
intelli.Status.EndTime = crd.Status.EndTime
return nil
}
Loading

0 comments on commit 6af945e

Please sign in to comment.