diff --git a/cmd/controller-manager/app/controllers.go b/cmd/controller-manager/app/controllers.go index d23f76e64461810566930f2b0d23e3498199a903..0bd907f0be845cf0ffcf2215aae5a4aaf4726cb2 100644 --- a/cmd/controller-manager/app/controllers.go +++ b/cmd/controller-manager/app/controllers.go @@ -88,7 +88,8 @@ func AddControllers(mgr manager.Manager, cfg *rest.Config, stopCh <-chan struct{ informerFactory.Core().V1().Services(), servicemeshInformer.Servicemesh().V1alpha2().ServicePolicies(), kubeClient, - istioclient) + istioclient, + servicemeshclient) apController := application.NewApplicationController(informerFactory.Core().V1().Services(), informerFactory.Apps().V1().Deployments(), diff --git a/pkg/apiserver/devops/devops.go b/pkg/apiserver/devops/devops.go index 5245e35290c48699b60e45df2ddb9fd4827a146d..13314add0a3f003a2bd921e40dfa67b54c45bc2e 100644 --- a/pkg/apiserver/devops/devops.go +++ b/pkg/apiserver/devops/devops.go @@ -104,11 +104,15 @@ func GetBranchStepLog(req *restful.Request, resp *restful.Response) { nodeId := req.PathParameter("nodeId") stepId := req.PathParameter("stepId") - res, err := devops.GetBranchStepLog(projectName, pipelineName, branchName, runId, nodeId, stepId, req.Request) + res, header, err := devops.GetBranchStepLog(projectName, pipelineName, branchName, runId, nodeId, stepId, req.Request) + if err != nil { parseErr(err, resp) return } + for k, v := range header { + resp.AddHeader(k, v[0]) + } resp.Write(res) } @@ -119,11 +123,14 @@ func GetStepLog(req *restful.Request, resp *restful.Response) { nodeId := req.PathParameter("nodeId") stepId := req.PathParameter("stepId") - res, err := devops.GetStepLog(projectName, pipelineName, runId, nodeId, stepId, req.Request) + res, header, err := devops.GetStepLog(projectName, pipelineName, runId, nodeId, stepId, req.Request) if err != nil { parseErr(err, resp) return } + for k, v := range header { + resp.AddHeader(k, v[0]) + } resp.Write(res) } diff --git a/pkg/controller/application/application_controller.go b/pkg/controller/application/application_controller.go index bebd16e5e41be1e09c08d6c67e928aef8ce65463..208f28d85d1811451ba6bae0380b93d6622babca 100644 --- a/pkg/controller/application/application_controller.go +++ b/pkg/controller/application/application_controller.go @@ -149,7 +149,7 @@ func NewApplicationController(serviceInformer coreinformers.ServiceInformer, } func (v *ApplicationController) Start(stopCh <-chan struct{}) error { - v.Run(5, stopCh) + v.Run(2, stopCh) return nil } diff --git a/pkg/controller/destinationrule/destinationrule_controller.go b/pkg/controller/destinationrule/destinationrule_controller.go index 688ec08c5641edf07a0182be07e3e7ff6e0d7207..3b9f5f5883c0785e339cb1a52f942a35651dc7dd 100644 --- a/pkg/controller/destinationrule/destinationrule_controller.go +++ b/pkg/controller/destinationrule/destinationrule_controller.go @@ -34,6 +34,7 @@ import ( "k8s.io/client-go/util/workqueue" "time" + servicemeshclient "kubesphere.io/kubesphere/pkg/client/clientset/versioned" servicemeshinformers "kubesphere.io/kubesphere/pkg/client/informers/externalversions/servicemesh/v1alpha2" servicemeshlisters "kubesphere.io/kubesphere/pkg/client/listers/servicemesh/v1alpha2" ) @@ -53,6 +54,7 @@ type DestinationRuleController struct { client clientset.Interface destinationRuleClient istioclientset.Interface + servicemeshClient servicemeshclient.Interface eventBroadcaster record.EventBroadcaster eventRecorder record.EventRecorder @@ -79,7 +81,8 @@ func NewDestinationRuleController(deploymentInformer informersv1.DeploymentInfor serviceInformer coreinformers.ServiceInformer, servicePolicyInformer servicemeshinformers.ServicePolicyInformer, client clientset.Interface, - destinationRuleClient istioclientset.Interface) *DestinationRuleController { + destinationRuleClient istioclientset.Interface, + servicemeshClient servicemeshclient.Interface) *DestinationRuleController { broadcaster := record.NewBroadcaster() broadcaster.StartLogging(func(format string, args ...interface{}) { @@ -95,6 +98,7 @@ func NewDestinationRuleController(deploymentInformer informersv1.DeploymentInfor v := &DestinationRuleController{ client: client, destinationRuleClient: destinationRuleClient, + servicemeshClient: servicemeshClient, queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "destinationrule"), workerLoopPeriod: time.Second, } @@ -211,12 +215,20 @@ func (v *DestinationRuleController) syncService(key string) error { service, err := v.serviceLister.Services(namespace).Get(name) if err != nil { - // Delete the corresponding destinationrule if there is any, as the service has been deleted. + // delete the corresponding destinationrule if there is any, as the service has been deleted. err = v.destinationRuleClient.NetworkingV1alpha3().DestinationRules(namespace).Delete(name, nil) if err != nil && !errors.IsNotFound(err) { log.Error(err, "delete destination rule failed", "namespace", namespace, "name", name) return err } + + // delete orphan service policy if there is any + err = v.servicemeshClient.ServicemeshV1alpha2().ServicePolicies(namespace).Delete(name, nil) + if err != nil && !errors.IsNotFound(err) { + log.Error(err, "delete orphan service policy failed", "namespace", namespace, "name", name) + return err + } + return nil } @@ -293,6 +305,7 @@ func (v *DestinationRuleController) syncService(key string) error { } dr := currentDestinationRule.DeepCopy() + dr.Spec.TrafficPolicy = nil dr.Spec.Subsets = subsets // if len(servicePolicies) > 0 { @@ -332,9 +345,9 @@ func (v *DestinationRuleController) syncService(key string) error { } if createDestinationRule { - newDestinationRule, err = v.destinationRuleClient.NetworkingV1alpha3().DestinationRules(namespace).Create(newDestinationRule) + _, err = v.destinationRuleClient.NetworkingV1alpha3().DestinationRules(namespace).Create(newDestinationRule) } else { - newDestinationRule, err = v.destinationRuleClient.NetworkingV1alpha3().DestinationRules(namespace).Update(newDestinationRule) + _, err = v.destinationRuleClient.NetworkingV1alpha3().DestinationRules(namespace).Update(newDestinationRule) } if err != nil { diff --git a/pkg/controller/virtualservice/virtualservice_controller.go b/pkg/controller/virtualservice/virtualservice_controller.go index 42e2cbb5b7d38ddf0974790c885ab5e745262b7d..ba81de932584f930b3ad2251c0707b769fcf7f68 100644 --- a/pkg/controller/virtualservice/virtualservice_controller.go +++ b/pkg/controller/virtualservice/virtualservice_controller.go @@ -231,6 +231,14 @@ func (v *VirtualServiceController) syncService(key string) error { log.Error(err, "delete orphan virtualservice failed", "namespace", namespace, "name", service.Name) return err } + + // delete the orphan strategy if there is any + err = v.servicemeshClient.ServicemeshV1alpha2().Strategies(namespace).Delete(name, nil) + if err != nil && !errors.IsNotFound(err) { + log.Error(err, "delete orphan strategy failed", "namespace", namespace, "name", service.Name) + return err + } + return nil } log.Error(err, "get service failed", "namespace", namespace, "name", name) @@ -385,9 +393,9 @@ func (v *VirtualServiceController) syncService(key string) error { } if createVirtualService { - newVirtualService, err = v.virtualServiceClient.NetworkingV1alpha3().VirtualServices(namespace).Create(newVirtualService) + _, err = v.virtualServiceClient.NetworkingV1alpha3().VirtualServices(namespace).Create(newVirtualService) } else { - newVirtualService, err = v.virtualServiceClient.NetworkingV1alpha3().VirtualServices(namespace).Update(newVirtualService) + _, err = v.virtualServiceClient.NetworkingV1alpha3().VirtualServices(namespace).Update(newVirtualService) } if err != nil { diff --git a/pkg/models/devops/devops.go b/pkg/models/devops/devops.go index f91c5ef10e63ffd9487e6945b6ce94d003c575b3..69c4d37a53da405ef86e6861c6a811173e805832 100644 --- a/pkg/models/devops/devops.go +++ b/pkg/models/devops/devops.go @@ -106,30 +106,31 @@ func GetPipelineRunNodesbyBranch(projectName, pipelineName, branchName, runId st return res, err } -func GetBranchStepLog(projectName, pipelineName, branchName, runId, nodeId, stepId string, req *http.Request) ([]byte, error) { +func GetBranchStepLog(projectName, pipelineName, branchName, runId, nodeId, stepId string, req *http.Request) ([]byte, http.Header, error) { baseUrl := fmt.Sprintf(jenkins.Server+GetBranchStepLogUrl+req.URL.RawQuery, projectName, pipelineName, branchName, runId, nodeId, stepId) log.Infof("Jenkins-url: " + baseUrl) - resBody, err := sendJenkinsRequest(baseUrl, req) + resBody, header, err := jenkinsClient(baseUrl, req) if err != nil { log.Error(err) - return nil, err + return nil, nil, err } - return resBody, err + return resBody, header, err } -func GetStepLog(projectName, pipelineName, runId, nodeId, stepId string, req *http.Request) ([]byte, error) { +func GetStepLog(projectName, pipelineName, runId, nodeId, stepId string, req *http.Request) ([]byte, http.Header, error) { baseUrl := fmt.Sprintf(jenkins.Server+GetStepLogUrl+req.URL.RawQuery, projectName, pipelineName, runId, nodeId, stepId) log.Infof("Jenkins-url: " + baseUrl) - resBody, err := sendJenkinsRequest(baseUrl, req) + resBody, header, err := jenkinsClient(baseUrl, req) if err != nil { log.Error(err) - return nil, err + return nil, nil, err } - return resBody, err + return resBody, header, err + } func Validate(scmId string, req *http.Request) ([]byte, error) { @@ -420,12 +421,19 @@ func CheckScriptCompile(req *http.Request) ([]byte, error) { } func CheckCron(req *http.Request) (*CheckCronRes, error) { - baseUrl := jenkins.Server + CheckCronUrl + req.URL.RawQuery - log.Infof("Jenkins-url: " + baseUrl) - req.SetBasicAuth(jenkins.Requester.BasicAuth.Username, jenkins.Requester.BasicAuth.Password) + newurl, err := url.Parse(jenkins.Server + CheckCronUrl + req.URL.RawQuery) + + reqJenkins := &http.Request{ + Method: http.MethodGet, + URL: newurl, + Header: http.Header{}, + } var res = new(CheckCronRes) + client := &http.Client{Timeout: 30 * time.Second} - resp, err := http.Get(baseUrl) + reqJenkins.SetBasicAuth(jenkins.Requester.BasicAuth.Username, jenkins.Requester.BasicAuth.Password) + + resp, err := client.Do(reqJenkins) if err != nil { log.Error(err) return res, err @@ -658,10 +666,15 @@ func GetNodesDetail(projectName, pipelineName, runId string, req *http.Request) // create jenkins request func sendJenkinsRequest(baseUrl string, req *http.Request) ([]byte, error) { + resBody, _, err := jenkinsClient(baseUrl, req) + return resBody, err +} + +func jenkinsClient(baseUrl string, req *http.Request) ([]byte, http.Header, error) { newReqUrl, err := url.Parse(baseUrl) if err != nil { log.Error(err) - return nil, err + return nil, nil, err } client := &http.Client{Timeout: 30 * time.Second} @@ -678,19 +691,21 @@ func sendJenkinsRequest(baseUrl string, req *http.Request) ([]byte, error) { resp, err := client.Do(newRequest) if err != nil { log.Error(err) - return nil, err + return nil, nil, err } - defer resp.Body.Close() resBody, _ := getRespBody(resp) + defer resp.Body.Close() + if resp.StatusCode >= http.StatusBadRequest { jkerr := new(JkError) jkerr.Code = resp.StatusCode jkerr.Message = http.StatusText(resp.StatusCode) - return nil, jkerr + return nil, nil, jkerr } - return resBody, err + return resBody, resp.Header, nil + } // Decompress response.body of JenkinsAPIResponse diff --git a/pkg/models/devops/urlconfig.go b/pkg/models/devops/urlconfig.go index a6df50c5f28140639809147460bcfb31c0441be9..05a9355eb2c39c34d296d3c8fb25e5ff0effa0f0 100644 --- a/pkg/models/devops/urlconfig.go +++ b/pkg/models/devops/urlconfig.go @@ -19,43 +19,45 @@ package devops // Some apis for Jenkins. const ( - GetPipeBranchUrl = "/blue/rest/organizations/jenkins/pipelines/%s/%s/branches/?" + GetPipeBranchUrl = "/blue/rest/organizations/jenkins/pipelines/%s/pipelines/%s/branches/?" GetBranchPipeUrl = "/blue/rest/organizations/jenkins/pipelines/%s/pipelines/%s/branches/%s/" - GetPipelineUrl = "/blue/rest/organizations/jenkins/pipelines/%s/%s/" + GetPipelineUrl = "/blue/rest/organizations/jenkins/pipelines/%s/pipelines/%s/" SearchPipelineUrl = "/blue/rest/search/?" - RunBranchPipelineUrl = "/blue/rest/organizations/jenkins/pipelines/%s/%s/branches/%s/runs/" - RunPipelineUrl = "/blue/rest/organizations/jenkins/pipelines/%s/%s/runs/" - GetPipelineRunUrl = "/blue/rest/organizations/jenkins/pipelines/%s/%s/runs/%s/" - GetPipeBranchRunUrl = "/blue/rest/organizations/jenkins/pipelines/%s/%s/branches/%s/runs/%s/" - SearchPipelineRunUrl = "/blue/rest/organizations/jenkins/pipelines/%s/%s/runs/?" - GetBranchPipeRunNodesUrl = "/blue/rest/organizations/jenkins/pipelines/%s/%s/branches/%s/runs/%s/nodes/?" - GetPipeRunNodesUrl = "/blue/rest/organizations/jenkins/pipelines/%s/%s/runs/%s/nodes/?" - GetBranchRunLogUrl = "/blue/rest/organizations/jenkins/pipelines/%s/%s/branches/%s/runs/%s/log/?" - GetRunLogUrl = "/blue/rest/organizations/jenkins/pipelines/%s/%s/runs/%s/log/?" - GetBranchStepLogUrl = "/blue/rest/organizations/jenkins/pipelines/%s/%s/branches/%s/runs/%s/nodes/%s/steps/%s/log/?" - GetStepLogUrl = "/blue/rest/organizations/jenkins/pipelines/%s/%s/runs/%s/nodes/%s/steps/%s/log/?" + RunBranchPipelineUrl = "/blue/rest/organizations/jenkins/pipelines/%s/pipelines/%s/branches/%s/runs/" + RunPipelineUrl = "/blue/rest/organizations/jenkins/pipelines/%s/pipelines/%s/runs/" + GetPipelineRunUrl = "/blue/rest/organizations/jenkins/pipelines/%s/pipelines/%s/runs/%s/" + GetPipeBranchRunUrl = "/blue/rest/organizations/jenkins/pipelines/%s/pipelines/%s/branches/%s/runs/%s/" + SearchPipelineRunUrl = "/blue/rest/organizations/jenkins/pipelines/%s/pipelines/%s/runs/?" + GetBranchPipeRunNodesUrl = "/blue/rest/organizations/jenkins/pipelines/%s/pipelines/%s/branches/%s/runs/%s/nodes/?" + GetPipeRunNodesUrl = "/blue/rest/organizations/jenkins/pipelines/%s/pipelines/%s/runs/%s/nodes/?" + GetBranchRunLogUrl = "/blue/rest/organizations/jenkins/pipelines/%s/pipelines/%s/branches/%s/runs/%s/log/?" + GetRunLogUrl = "/blue/rest/organizations/jenkins/pipelines/%s/pipelines/%s/runs/%s/log/?" + GetBranchStepLogUrl = "/blue/rest/organizations/jenkins/pipelines/%s/pipelines/%s/branches/%s/runs/%s/nodes/%s/steps/%s/log/?" + GetStepLogUrl = "/blue/rest/organizations/jenkins/pipelines/%s/pipelines/%s/runs/%s/nodes/%s/steps/%s/log/?" StopBranchPipelineUrl = "/blue/rest/organizations/jenkins/pipelines/%s/pipelines/%s/branches/%s/runs/%s/stop/?" StopPipelineUrl = "/blue/rest/organizations/jenkins/pipelines/%s/pipelines/%s/runs/%s/stop/?" ReplayBranchPipelineUrl = "/blue/rest/organizations/jenkins/pipelines/%s/pipelines/%s/branches/%s/runs/%s/replay/" ReplayPipelineUrl = "/blue/rest/organizations/jenkins/pipelines/%s/pipelines/%s/runs/%s/replay/" - GetBranchArtifactsUrl = "/blue/rest/organizations/jenkins/pipelines/%s/%s/branches/%s/runs/%s/artifacts/?" - GetArtifactsUrl = "/blue/rest/organizations/jenkins/pipelines/%s/%s/runs/%s/artifacts/?" - GetBranchStepsStatusUrl = "/blue/rest/organizations/jenkins/pipelines/%s/%s/branches/%s/runs/%s/nodes/%s/steps/?" - GetStepsStatusUrl = "/blue/rest/organizations/jenkins/pipelines/%s/%s/runs/%s/nodes/%s/steps/?" - CheckBranchPipelineUrl = "/blue/rest/organizations/jenkins/pipelines/%s/pipelines/%s/branches/%s/runs/%s/nodes/%s/steps/%s/" - CheckPipelineUrl = "/blue/rest/organizations/jenkins/pipelines/%s/pipelines/%s/runs/%s/nodes/%s/steps/%s/" - GetBranchNodeStepsUrl = "/blue/rest/organizations/jenkins/pipelines/%s/%s/branches/%s/runs/%s/nodes/%s/steps/?" - GetNodeStepsUrl = "/blue/rest/organizations/jenkins/pipelines/%s/%s/runs/%s/nodes/%s/steps/?" - ValidateUrl = "/blue/rest/organizations/jenkins/scm/%s/validate" - GetSCMOrgUrl = "/blue/rest/organizations/jenkins/scm/%s/organizations/?" - GetOrgRepoUrl = "/blue/rest/organizations/jenkins/scm/%s/organizations/%s/repositories/?" - GetConsoleLogUrl = "/job/%s/job/%s/indexing/consoleText" - ScanBranchUrl = "/job/%s/job/%s/build?" - GetCrumbUrl = "/crumbIssuer/api/json/" - CheckScriptCompileUrl = "/job/init-job/descriptorByName/org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition/checkScriptCompile" - CheckCronUrl = "/job/init-job/descriptorByName/hudson.triggers.TimerTrigger/checkSpec?" - ToJenkinsfileUrl = "/pipeline-model-converter/toJenkinsfile" - ToJsonUrl = "/pipeline-model-converter/toJson" - GetNotifyCommitUrl = "/git/notifyCommit/?" - GithubWebhookUrl = "/github-webhook/" + GetBranchArtifactsUrl = "/blue/rest/organizations/jenkins/pipelines/%s/pipelines/%s/branches/%s/runs/%s/artifacts/?" + GetArtifactsUrl = "/blue/rest/organizations/jenkins/pipelines/%s/pipelines/%s/runs/%s/artifacts/?" + GetBranchStepsStatusUrl = "/blue/rest/organizations/jenkins/pipelines/%s/pipelines/%s/branches/%s/runs/%s/nodes/%s/steps/?" + + GetStepsStatusUrl = "/blue/rest/organizations/jenkins/pipelines/%s/pipelines/%s/runs/%s/nodes/%s/steps/?" + + CheckBranchPipelineUrl = "/blue/rest/organizations/jenkins/pipelines/%s/pipelines/%s/branches/%s/runs/%s/nodes/%s/steps/%s/" + CheckPipelineUrl = "/blue/rest/organizations/jenkins/pipelines/%s/pipelines/%s/runs/%s/nodes/%s/steps/%s/" + GetBranchNodeStepsUrl = "/blue/rest/organizations/jenkins/pipelines/%s/pipelines/%s/branches/%s/runs/%s/nodes/%s/steps/?" + GetNodeStepsUrl = "/blue/rest/organizations/jenkins/pipelines/%s/pipelines/%s/runs/%s/nodes/%s/steps/?" + ValidateUrl = "/blue/rest/organizations/jenkins/scm/%s/validate" + GetSCMOrgUrl = "/blue/rest/organizations/jenkins/scm/%s/organizations/?" + GetOrgRepoUrl = "/blue/rest/organizations/jenkins/scm/%s/organizations/%s/repositories/?" + GetConsoleLogUrl = "/job/%s/job/%s/indexing/consoleText" + ScanBranchUrl = "/job/%s/job/%s/build?" + GetCrumbUrl = "/crumbIssuer/api/json/" + CheckScriptCompileUrl = "/job/init-job/descriptorByName/org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition/checkScriptCompile" + CheckCronUrl = "/job/init-job/descriptorByName/hudson.triggers.TimerTrigger/checkSpec?" + ToJenkinsfileUrl = "/pipeline-model-converter/toJenkinsfile" + ToJsonUrl = "/pipeline-model-converter/toJson" + GetNotifyCommitUrl = "/git/notifyCommit/?" + GithubWebhookUrl = "/github-webhook/" )