Skip to content

Commit

Permalink
resource request
Browse files Browse the repository at this point in the history
  • Loading branch information
John-Lin committed Oct 4, 2018
1 parent 5530c7d commit 7532f4a
Show file tree
Hide file tree
Showing 13 changed files with 265 additions and 165 deletions.
37 changes: 31 additions & 6 deletions src/deployment/deployment.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
appsv1 "k8s.io/api/apps/v1"
v2beta1 "k8s.io/api/autoscaling/v2beta1"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

"gopkg.in/mgo.v2/bson"
Expand Down Expand Up @@ -347,17 +348,41 @@ func CreateDeployment(sp *serviceprovider.Container, deploy *entity.Deployment)
volumeMounts = append(volumeMounts, configMapMounts...)

var containers []corev1.Container
var c corev1.Container

securityContext := generateContainerSecurity(deploy)
envVars := generateEnvVars(deploy)
for _, container := range deploy.Containers {
containers = append(containers, corev1.Container{
Name: container.Name,
Image: container.Image,
Command: container.Command,

for _, deployContainer := range deploy.Containers {
c = corev1.Container{
Name: deployContainer.Name,
Image: deployContainer.Image,
Command: deployContainer.Command,
VolumeMounts: volumeMounts,
SecurityContext: securityContext,
Env: envVars,
})
}
if deployContainer.ResourceRequestCPU != 0 {
c.Resources = corev1.ResourceRequirements{
Requests: corev1.ResourceList{
"cpu": resource.MustParse(strconv.Itoa(deployContainer.ResourceRequestCPU) + "m"),
},
}
} else if deployContainer.ResourceRequestMemory != 0 {
c.Resources = corev1.ResourceRequirements{
Requests: corev1.ResourceList{
"memory": resource.MustParse(strconv.Itoa(deployContainer.ResourceRequestMemory) + "Mi"),
},
}
} else if deployContainer.ResourceRequestMemory != 0 && deployContainer.ResourceRequestCPU != 0 {
c.Resources = corev1.ResourceRequirements{
Requests: corev1.ResourceList{
"cpu": resource.MustParse(strconv.Itoa(deployContainer.ResourceRequestCPU) + "m"),
"memory": resource.MustParse(strconv.Itoa(deployContainer.ResourceRequestMemory) + "Mi"),
},
}
}
containers = append(containers, c)
}

p := appsv1.Deployment{
Expand Down
35 changes: 18 additions & 17 deletions src/entity/deployment.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,23 +59,24 @@ type DeploymentConfig struct {

// Deployment is the structure for deployment info
type Deployment struct {
ID bson.ObjectId `bson:"_id,omitempty" json:"id" validate:"-"`
OwnerID bson.ObjectId `bson:"ownerID,omitempty" json:"ownerID" validate:"-"`
Name string `bson:"name" json:"name" validate:"required,k8sname"`
Namespace string `bson:"namespace" json:"namespace" validate:"required"`
Labels map[string]string `bson:"labels,omitempty" json:"labels" validate:"required,dive,keys,printascii,endkeys,required,printascii"`
EnvVars map[string]string `bson:"envVars,omitempty" json:"envVars" validate:"required,dive,keys,printascii,endkeys,required,printascii"`
Containers []Container `bson:"containers" json:"containers" validate:"required,dive,required"`
Volumes []DeploymentVolume `bson:"volumes,omitempty" json:"volumes" validate:"required,dive,required"`
ConfigMaps []DeploymentConfig `bson:"configMaps,omitempty" json:"configMaps" validate:"required,dive,required"`
Networks []DeploymentNetwork `bson:"networks,omitempty" json:"networks" validate:"required,dive,required"`
Capability bool `bson:"capability" json:"capability" validate:"-"`
NetworkType string `bson:"networkType" json:"networkType" validate:"required,eq=host|eq=cluster|eq=custom"`
NodeAffinity []string `bson:"nodeAffinity" json:"nodeAffinity" validate:"required"`
IsAutoscaler bool `bson:"isAutoscaler" json:"isAutoscaler" validate:"-"`
AutoscalerInfo AutoscalerInfo `bson:"autoscalerInfo" json:"autoscalerInfo" validate:"-"`
CreatedBy User `json:"createdBy" validate:"-"`
CreatedAt *time.Time `bson:"createdAt,omitempty" json:"createdAt,omitempty" validate:"-"`
ID bson.ObjectId `bson:"_id,omitempty" json:"id" validate:"-"`
OwnerID bson.ObjectId `bson:"ownerID,omitempty" json:"ownerID" validate:"-"`
Name string `bson:"name" json:"name" validate:"required,k8sname"`
Namespace string `bson:"namespace" json:"namespace" validate:"required"`
Labels map[string]string `bson:"labels,omitempty" json:"labels" validate:"required,dive,keys,printascii,endkeys,required,printascii"`
EnvVars map[string]string `bson:"envVars,omitempty" json:"envVars" validate:"required,dive,keys,printascii,endkeys,required,printascii"`
Containers []Container `bson:"containers" json:"containers" validate:"required,dive,required"`
Volumes []DeploymentVolume `bson:"volumes,omitempty" json:"volumes" validate:"required,dive,required"`
ConfigMaps []DeploymentConfig `bson:"configMaps,omitempty" json:"configMaps" validate:"required,dive,required"`
Networks []DeploymentNetwork `bson:"networks,omitempty" json:"networks" validate:"required,dive,required"`
Capability bool `bson:"capability" json:"capability" validate:"-"`
NetworkType string `bson:"networkType" json:"networkType" validate:"required,eq=host|eq=cluster|eq=custom"`
NodeAffinity []string `bson:"nodeAffinity" json:"nodeAffinity" validate:"required"`
IsCapableAutoscaleResources []string `bson:"isCapableAutoscaleResources" json:"isCapableAutoscaleResources" validate:"required,dive,required,eq=memory|eq=cpu"`
IsEnableAutoscale bool `bson:"isEnableAutoscale" json:"isEnableAutoscale" validate:"-"`
AutoscalerInfo AutoscalerInfo `bson:"autoscalerInfo" json:"autoscalerInfo" validate:"-"`
CreatedBy User `json:"createdBy" validate:"-"`
CreatedAt *time.Time `bson:"createdAt,omitempty" json:"createdAt,omitempty" validate:"-"`

Replicas int32 `bson:"replicas" json:"replicas" validate:"required"`
}
Expand Down
8 changes: 5 additions & 3 deletions src/entity/pod.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,11 @@ const (

// Container is the structure for init Container info
type Container struct {
Name string `bson:"name" json:"name" validate:"required,k8sname"`
Image string `bson:"image" json:"image" validate:"required"`
Command []string `bson:"command" json:"command" validate:"required,dive,required"`
Name string `bson:"name" json:"name" validate:"required,k8sname"`
Image string `bson:"image" json:"image" validate:"required"`
Command []string `bson:"command" json:"command" validate:"required,dive,required"`
ResourceRequestCPU int `bson:"resourceRequestCPU" json:"resourceRequestCPU" validate:"-"`
ResourceRequestMemory int `bson:"resourceRequestMemory" json:"resourceRequestMemory" validate:"-"`
}

// PodRouteGw is the structure for add IP routing table with gateway
Expand Down
33 changes: 18 additions & 15 deletions src/server/handler_app_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,25 +61,28 @@ func (suite *AppTestSuite) TestCreateApp() {
namespace := "default"
containers := []entity.Container{
{
Name: namesgenerator.GetRandomName(0),
Image: "busybox",
Command: []string{"sleep", "3600"},
Name: namesgenerator.GetRandomName(0),
Image: "busybox",
Command: []string{"sleep", "3600"},
ResourceRequestCPU: 0,
ResourceRequestMemory: 0,
},
}
tName := namesgenerator.GetRandomName(0)
deploy := entity.Deployment{
Name: tName,
Namespace: namespace,
Labels: map[string]string{},
EnvVars: map[string]string{},
Containers: containers,
Volumes: []entity.DeploymentVolume{},
ConfigMaps: []entity.DeploymentConfig{},
Networks: []entity.DeploymentNetwork{},
Capability: true,
NetworkType: entity.DeploymentHostNetwork,
NodeAffinity: []string{},
Replicas: 1,
Name: tName,
Namespace: namespace,
Labels: map[string]string{},
EnvVars: map[string]string{},
Containers: containers,
Volumes: []entity.DeploymentVolume{},
ConfigMaps: []entity.DeploymentConfig{},
Networks: []entity.DeploymentNetwork{},
IsCapableAutoscaleResources: []string{},
Capability: true,
NetworkType: entity.DeploymentHostNetwork,
NodeAffinity: []string{},
Replicas: 1,
}

ports := []entity.ServicePort{
Expand Down
46 changes: 37 additions & 9 deletions src/server/handler_deployment.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ import (
"github.com/linkernetworks/vortex/src/net/http/query"
"github.com/linkernetworks/vortex/src/server/backend"
"github.com/linkernetworks/vortex/src/web"
"k8s.io/api/apps/v1"
appv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors"

mgo "gopkg.in/mgo.v2"
Expand All @@ -39,6 +40,21 @@ func createDeploymentHandler(ctx *web.Context) {
return
}

// autoscale resource request setting prerequisite check
for _, container := range p.Containers {
if container.ResourceRequestCPU != 0 {
p.IsCapableAutoscaleResources = append(p.IsCapableAutoscaleResources, "cpu")
}
if container.ResourceRequestMemory != 0 {
p.IsCapableAutoscaleResources = append(p.IsCapableAutoscaleResources, "memory")
}
}

if p.NetworkType == entity.DeploymentCustomNetwork {
// clear the slice
p.IsCapableAutoscaleResources = nil
}

if err := sp.Validator.Struct(p); err != nil {
response.BadRequest(req.Request, resp.ResponseWriter, err)
return
Expand Down Expand Up @@ -83,6 +99,7 @@ func createDeploymentHandler(ctx *web.Context) {
}
return
}

if err := session.Insert(entity.DeploymentCollectionName, &p); err != nil {
if mgo.IsDup(err) {
response.Conflict(req.Request, resp.ResponseWriter, fmt.Errorf("Deployment Name: %s already existed", p.Name))
Expand Down Expand Up @@ -255,25 +272,36 @@ func uploadDeploymentYAMLHandler(ctx *web.Context) {
return
}

deploymentObj, ok := obj.(*v1.Deployment)
deploymentObj, ok := obj.(*appv1.Deployment)
if !ok {
response.BadRequest(req.Request, resp.ResponseWriter, fmt.Errorf("The YAML file is not for creating deployment"))
return
}

d := entity.Deployment{
ID: bson.NewObjectId(),
OwnerID: bson.ObjectIdHex(userID),
Name: deploymentObj.ObjectMeta.Name,
Namespace: deploymentObj.ObjectMeta.Namespace,
NetworkType: entity.DeploymentClusterNetwork,
Replicas: *deploymentObj.Spec.Replicas,
ID: bson.NewObjectId(),
OwnerID: bson.ObjectIdHex(userID),
Name: deploymentObj.ObjectMeta.Name,
Namespace: deploymentObj.ObjectMeta.Namespace,
Replicas: *deploymentObj.Spec.Replicas,
}

if d.Namespace == "" {
d.Namespace = "default"
}

// autoscale resource request setting prerequisite check
for _, container := range deploymentObj.Spec.Template.Spec.Containers {
// check if map contains cpu key
if _, ok := container.Resources.Requests[corev1.ResourceCPU]; ok {
d.IsCapableAutoscaleResources = append(d.IsCapableAutoscaleResources, "cpu")
}
// check if map contains memory key
if _, ok := container.Resources.Requests[corev1.ResourceMemory]; ok {
d.IsCapableAutoscaleResources = append(d.IsCapableAutoscaleResources, "memory")
}
}

session := sp.Mongo.NewSession()
session.C(entity.DeploymentCollectionName).EnsureIndex(mgo.Index{
Key: []string{"name"},
Expand Down Expand Up @@ -376,7 +404,7 @@ func updateAutoscalerHandler(ctx *web.Context) {
}

// Update autoscalerInfo
deployment.IsAutoscaler = enableAutoscaler
deployment.IsEnableAutoscale = enableAutoscaler
deployment.AutoscalerInfo = autoscalerInfo
modifier := bson.M{
"$set": deployment,
Expand Down
Loading

0 comments on commit 7532f4a

Please sign in to comment.