Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
134 changes: 66 additions & 68 deletions src/backend/controllers/kubernetes/deployment/deployment.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (

"k8s.io/api/apps/v1beta1"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/client-go/kubernetes"

"github.com/Qihoo360/wayne/src/backend/client"
"github.com/Qihoo360/wayne/src/backend/controllers/base"
Expand Down Expand Up @@ -130,75 +129,42 @@ func (c *KubeDeploymentController) Deploy() {
}

cluster := c.Ctx.Input.Param(":cluster")
cli, err := client.Client(cluster)
if err == nil {
namespaceModel, err := models.NamespaceModel.GetNamespaceByAppId(c.AppId)
if err != nil {
logs.Error("get getNamespaceMetaData error.%v", err)
c.HandleError(err)
return
}
cli := c.Manager(cluster)

clusterModel, err := models.ClusterModel.GetParsedMetaDataByName(cluster)
if err != nil {
logs.Error("get cluster error.%v", err)
c.HandleError(err)
return
}

deploymentModel, err := models.DeploymentModel.GetParseMetaDataById(int64(deploymentId))
if err != nil {
logs.Error("get deployment error.%v", err)
c.HandleError(err)
return
}
namespaceModel, err := models.NamespaceModel.GetNamespaceByAppId(c.AppId)
if err != nil {
logs.Error("get getNamespaceMetaData error.%v", err)
c.HandleError(err)
return
}

common.DeploymentPreDeploy(&kubeDeployment, deploymentModel, clusterModel, namespaceModel)
clusterModel, err := models.ClusterModel.GetParsedMetaDataByName(cluster)
if err != nil {
logs.Error("get cluster error.%v", err)
c.HandleError(err)
return
}

publishHistory := &models.PublishHistory{
Type: models.PublishTypeDeployment,
ResourceId: int64(deploymentId),
ResourceName: kubeDeployment.Name,
TemplateId: int64(tplId),
Cluster: cluster,
User: c.User.Name,
}
deploymentModel, err := models.DeploymentModel.GetParseMetaDataById(int64(deploymentId))
if err != nil {
logs.Error("get deployment error.%v", err)
c.HandleError(err)
return
}

defer models.PublishHistoryModel.Add(publishHistory)
common.DeploymentPreDeploy(&kubeDeployment, deploymentModel, clusterModel, namespaceModel)

err = checkResourceAvailable(namespaceModel, cli, &kubeDeployment, cluster)
if err != nil {
publishHistory.Status = models.ReleaseFailure
publishHistory.Message = err.Error()
c.HandleError(err)
return
}
publishHistory := &models.PublishHistory{
Type: models.PublishTypeDeployment,
ResourceId: int64(deploymentId),
ResourceName: kubeDeployment.Name,
TemplateId: int64(tplId),
Cluster: cluster,
User: c.User.Name,
}

// 发布资源到k8s平台
_, err = deployment.CreateOrUpdateDeployment(cli, &kubeDeployment)
if err != nil {
publishHistory.Status = models.ReleaseFailure
publishHistory.Message = err.Error()
logs.Error("deploy deployment error.%v", err)
c.HandleError(err)
return
} else {
publishHistory.Status = models.ReleaseSuccess
err = models.PublishStatusModel.Add(deploymentId, tplId, cluster, models.PublishTypeDeployment)
// 添加发布状态
if err != nil {
logs.Error("add deployment deploy status error.%v", err)
c.HandleError(err)
return
}

err = models.DeploymentModel.Update(*kubeDeployment.Spec.Replicas, deploymentModel, cluster)
if err != nil {
logs.Error("update deployment metadata error.%v", err)
c.HandleError(err)
return
}
}
defer func() {
models.PublishHistoryModel.Add(publishHistory)
webhook.PublishEventDeployment(c.NamespaceId, c.AppId, c.User.Name, c.Ctx.Input.IP(), webhook.UpgradeDeployment, response.Resource{
Type: publishHistory.Type,
ResourceId: publishHistory.ResourceId,
Expand All @@ -209,13 +175,45 @@ func (c *KubeDeploymentController) Deploy() {
Message: publishHistory.Message,
Object: kubeDeployment,
})
c.Success("ok")
} else {
c.AbortBadRequestFormat("Cluster")
}()

err = checkResourceAvailable(namespaceModel, cli.KubeClient, &kubeDeployment, cluster)
if err != nil {
publishHistory.Status = models.ReleaseFailure
publishHistory.Message = err.Error()
c.HandleError(err)
return
}

// 发布资源到k8s平台
_, err = deployment.CreateOrUpdateDeployment(cli.Client, &kubeDeployment)
if err != nil {
publishHistory.Status = models.ReleaseFailure
publishHistory.Message = err.Error()
logs.Error("deploy deployment error.%v", err)
c.HandleError(err)
return
}
publishHistory.Status = models.ReleaseSuccess
err = models.PublishStatusModel.Add(deploymentId, tplId, cluster, models.PublishTypeDeployment)
// 添加发布状态
if err != nil {
logs.Error("add deployment deploy status error.%v", err)
c.HandleError(err)
return
}

err = models.DeploymentModel.Update(*kubeDeployment.Spec.Replicas, deploymentModel, cluster)
if err != nil {
logs.Error("update deployment metadata error.%v", err)
c.HandleError(err)
return
}

c.Success("ok")
}

func checkResourceAvailable(ns *models.Namespace, cli *kubernetes.Clientset, kubeDeployment *v1beta1.Deployment, cluster string) error {
func checkResourceAvailable(ns *models.Namespace, cli client.ResourceHandler, kubeDeployment *v1beta1.Deployment, cluster string) error {
// this namespace can't use current cluster.
clusterMetas, ok := ns.MetaDataObj.ClusterMetas[cluster]
if !ok {
Expand Down
4 changes: 2 additions & 2 deletions src/backend/controllers/kubernetes/namespace/namespace.go
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ func (c *KubeNamespaceController) Resources() {
selectorMap[util.AppLabelKey] = appName
}
selector := labels.SelectorFromSet(selectorMap)
resourceUsage, err := namespace.ResourcesUsageByNamespace(m.Client, namespaceMetaData.Namespace, selector.String())
resourceUsage, err := namespace.ResourcesUsageByNamespace(m.KubeClient, namespaceMetaData.Namespace, selector.String())
if err != nil {
logs.Error("get (%s) k8s resource usage error. %v", m.Cluster.Name, err.Error())
errs = append(errs, err)
Expand Down Expand Up @@ -274,7 +274,7 @@ func (c *KubeNamespaceController) Statistics() {
selectorMap[util.AppLabelKey] = appName
}
selector := labels.SelectorFromSet(selectorMap)
resourceUsage, err := namespace.ResourcesOfAppByNamespace(m.Client, namespaceMetaData.Namespace, selector.String())
resourceUsage, err := namespace.ResourcesOfAppByNamespace(m.KubeClient, namespaceMetaData.Namespace, selector.String())
if err != nil {
logs.Error("get (%s) k8s resource usage error. %v", m.Cluster.Name, err.Error())
errs = append(errs, err)
Expand Down
127 changes: 62 additions & 65 deletions src/backend/controllers/kubernetes/statefulset/statefulset.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (

"k8s.io/api/apps/v1beta1"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/client-go/kubernetes"

"github.com/Qihoo360/wayne/src/backend/client"
"github.com/Qihoo360/wayne/src/backend/controllers/base"
Expand Down Expand Up @@ -66,74 +65,72 @@ func (c *KubeStatefulsetController) Deploy() {
}

cluster := c.Ctx.Input.Param(":cluster")
cli, err := client.Client(cluster)
if err == nil {
namespaceModel, err := getNamespace(c.AppId)
if err != nil {
logs.Error("get getNamespaceMetaData error.%v", err)
c.HandleError(err)
return
}
clusterModel, err := models.ClusterModel.GetParsedMetaDataByName(cluster)
if err != nil {
logs.Error("get cluster error.%v", err)
c.HandleError(err)
return
}
statefulsetModel, err := models.StatefulsetModel.GetParseMetaDataById(int64(statefulsetId))
if err != nil {
logs.Error("get statefulset error.%v", err)
c.HandleError(err)
return
}
statefulsetPreDeploy(&kubeStatefulset, statefulsetModel, clusterModel, namespaceModel)
cli := c.Manager(cluster)

publishHistory := &models.PublishHistory{
Type: models.PublishTypeStatefulSet,
ResourceId: int64(statefulsetId),
ResourceName: kubeStatefulset.Name,
TemplateId: int64(tplId),
Cluster: cluster,
User: c.User.Name,
}
namespaceModel, err := getNamespace(c.AppId)
if err != nil {
logs.Error("get getNamespaceMetaData error.%v", err)
c.HandleError(err)
return
}
clusterModel, err := models.ClusterModel.GetParsedMetaDataByName(cluster)
if err != nil {
logs.Error("get cluster error.%v", err)
c.HandleError(err)
return
}
statefulsetModel, err := models.StatefulsetModel.GetParseMetaDataById(int64(statefulsetId))
if err != nil {
logs.Error("get statefulset error.%v", err)
c.HandleError(err)
return
}
statefulsetPreDeploy(&kubeStatefulset, statefulsetModel, clusterModel, namespaceModel)

defer models.PublishHistoryModel.Add(publishHistory)
publishHistory := &models.PublishHistory{
Type: models.PublishTypeStatefulSet,
ResourceId: int64(statefulsetId),
ResourceName: kubeStatefulset.Name,
TemplateId: int64(tplId),
Cluster: cluster,
User: c.User.Name,
}

err = checkResourceAvailable(namespaceModel, cli, &kubeStatefulset, cluster)
if err != nil {
publishHistory.Status = models.ReleaseFailure
publishHistory.Message = err.Error()
c.HandleError(err)
return
}
defer models.PublishHistoryModel.Add(publishHistory)

// 发布资源到k8s平台
_, err = statefulset.CreateOrUpdateStatefulset(cli, &kubeStatefulset)
if err != nil {
publishHistory.Status = models.ReleaseFailure
publishHistory.Message = err.Error()
logs.Error("deploy statefulset error.%v", err)
c.HandleError(err)
return
} else {
publishHistory.Status = models.ReleaseSuccess
err = addDeployStatus(statefulsetId, tplId, cluster)
if err != nil {
logs.Error("add statefulset deploy status error.%v", err)
c.HandleError(err)
return
}
err = updateMetadata(*kubeStatefulset.Spec.Replicas, statefulsetModel, cluster)
if err != nil {
logs.Error("update statefulset metadata error.%v", err)
c.HandleError(err)
return
}
}
c.Success("ok")
} else {
c.AbortBadRequestFormat("Cluster")
err = checkResourceAvailable(namespaceModel, cli.KubeClient, &kubeStatefulset, cluster)
if err != nil {
publishHistory.Status = models.ReleaseFailure
publishHistory.Message = err.Error()
c.HandleError(err)
return
}

// 发布资源到k8s平台
_, err = statefulset.CreateOrUpdateStatefulset(cli.Client, &kubeStatefulset)
if err != nil {
publishHistory.Status = models.ReleaseFailure
publishHistory.Message = err.Error()
logs.Error("deploy statefulset error.%v", err)
c.HandleError(err)
return
}
publishHistory.Status = models.ReleaseSuccess
err = addDeployStatus(statefulsetId, tplId, cluster)
if err != nil {
logs.Error("add statefulset deploy status error.%v", err)
c.HandleError(err)
return
}
err = updateMetadata(*kubeStatefulset.Spec.Replicas, statefulsetModel, cluster)
if err != nil {
logs.Error("update statefulset metadata error.%v", err)
c.HandleError(err)
return
}

c.Success("ok")

}

func addDeployStatus(statefulsetId int64, tplId int64, cluster string) error {
Expand All @@ -152,7 +149,7 @@ func addDeployStatus(statefulsetId int64, tplId int64, cluster string) error {
return nil
}

func checkResourceAvailable(ns *models.Namespace, cli *kubernetes.Clientset, kubeStatefulset *v1beta1.StatefulSet, cluster string) error {
func checkResourceAvailable(ns *models.Namespace, cli client.ResourceHandler, kubeStatefulset *v1beta1.StatefulSet, cluster string) error {
// this namespace can't use current cluster.
clusterMetas, ok := ns.MetaDataObj.ClusterMetas[cluster]
if !ok {
Expand Down
7 changes: 5 additions & 2 deletions src/backend/resources/deployment/deployment.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"k8s.io/client-go/kubernetes"

"github.com/Qihoo360/wayne/src/backend/client"
"github.com/Qihoo360/wayne/src/backend/client/api"
erroresult "github.com/Qihoo360/wayne/src/backend/models/response/errors"
"github.com/Qihoo360/wayne/src/backend/resources/common"
"github.com/Qihoo360/wayne/src/backend/resources/event"
Expand All @@ -37,8 +38,10 @@ func GetDeploymentList(indexer *client.CacheFactory, namespace string) ([]*v1bet
return deployments, nil
}

func GetDeploymentResource(cli *kubernetes.Clientset, deployment *v1beta1.Deployment) (*common.ResourceList, error) {
old, err := cli.AppsV1beta1().Deployments(deployment.Namespace).Get(deployment.Name, metaV1.GetOptions{})
// GetDeploymentResource get deployment resource statistics
func GetDeploymentResource(cli client.ResourceHandler, deployment *v1beta1.Deployment) (*common.ResourceList, error) {
obj, err := cli.Get(api.ResourceNameStatefulSet, deployment.Namespace, deployment.Name)
old := obj.(*v1beta1.Deployment)
if err != nil {
if errors.IsNotFound(err) {
return common.DeploymentResourceList(deployment), nil
Expand Down
Loading