diff --git a/go.mod b/go.mod index c194410893..c6c9d6d321 100644 --- a/go.mod +++ b/go.mod @@ -88,12 +88,12 @@ require ( k8s.io/client-go v0.19.3 k8s.io/cluster-bootstrap v0.19.3 moul.io/http2curl/v2 v2.3.0 - yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20251024142004-e98de79fcabf + yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20251029114425-e74e51b2ee51 yunion.io/x/executor v0.0.0-20250518005516-5402e9e0bed0 yunion.io/x/jsonutils v1.0.1-0.20250507052344-1abcf4f443b1 yunion.io/x/log v1.0.1-0.20240305175729-7cf2d6cd5a91 yunion.io/x/ovsdb v0.0.0-20230306173834-f164f413a900 - yunion.io/x/pkg v1.10.4-0.20250820035218-6008459eb4f0 + yunion.io/x/pkg v1.10.4-0.20251029085629-5e6cd5e0d3ad yunion.io/x/s3cli v0.0.0-20241221171442-1c11599d28e1 yunion.io/x/sqlchemy v1.1.3-0.20250925091009-4ca0766fc8f0 yunion.io/x/structarg v0.0.0-20231017124457-df4d5009457c diff --git a/go.sum b/go.sum index ce5bcc1468..8227e51c72 100644 --- a/go.sum +++ b/go.sum @@ -1279,8 +1279,8 @@ sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20251024142004-e98de79fcabf h1:YXvJjd2mhGAYsACGXygfJ5Jti4xHE7E6iD4z7FHbWBo= -yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20251024142004-e98de79fcabf/go.mod h1:S9o/TRZsnYWGaGe7o3PpeOv6CgMY8ZJwITYsEnGfOgQ= +yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20251029114425-e74e51b2ee51 h1:gbA7+xd3rsHgj8W2XCNBRet5hSdbiBoME3082fs/p4U= +yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20251029114425-e74e51b2ee51/go.mod h1:S9o/TRZsnYWGaGe7o3PpeOv6CgMY8ZJwITYsEnGfOgQ= yunion.io/x/executor v0.0.0-20250518005516-5402e9e0bed0 h1:msG4SiDSVU7CrXH06WuHlNEZXIooTcmNbfrIGHuIHBU= yunion.io/x/executor v0.0.0-20250518005516-5402e9e0bed0/go.mod h1:Uxuou9WQIeJXNpy7t2fPLL0BYLvLiMvGQwY7Qc6aSws= yunion.io/x/jsonutils v0.0.0-20190625054549-a964e1e8a051/go.mod h1:4N0/RVzsYL3kH3WE/H1BjUQdFiWu50JGCFQuuy+Z634= @@ -1294,8 +1294,8 @@ yunion.io/x/ovsdb v0.0.0-20230306173834-f164f413a900 h1:Hu/4ERvoWaN6aiFs4h4/yvVB yunion.io/x/ovsdb v0.0.0-20230306173834-f164f413a900/go.mod h1:0vLkNEhlmA64HViPBAnSTUMrx5QP1CLsxXmxDKQ80tc= yunion.io/x/pkg v0.0.0-20190620104149-945c25821dbf/go.mod h1:t6rEGG2sQ4J7DhFxSZVOTjNd0YO/KlfWQyK1W4tog+E= yunion.io/x/pkg v0.0.0-20190628082551-f4033ba2ea30/go.mod h1:t6rEGG2sQ4J7DhFxSZVOTjNd0YO/KlfWQyK1W4tog+E= -yunion.io/x/pkg v1.10.4-0.20250820035218-6008459eb4f0 h1:/vHcYqzQInxqR1jjS+e7A0owRXj+/rvrIgES6uadUqs= -yunion.io/x/pkg v1.10.4-0.20250820035218-6008459eb4f0/go.mod h1:0Bwxqd9MA3ACi119/l02FprY/o9gHahmYC2bsSbnVpM= +yunion.io/x/pkg v1.10.4-0.20251029085629-5e6cd5e0d3ad h1:rvh05lRDppYWzVyIjU/y/vzXUvfQ8Oi47vioL+zGayA= +yunion.io/x/pkg v1.10.4-0.20251029085629-5e6cd5e0d3ad/go.mod h1:0Bwxqd9MA3ACi119/l02FprY/o9gHahmYC2bsSbnVpM= yunion.io/x/s3cli v0.0.0-20241221171442-1c11599d28e1 h1:1KJ3YYinydPHpDEQRXdr/T8SYcKZ5Er+m489H+PnaQ4= yunion.io/x/s3cli v0.0.0-20241221171442-1c11599d28e1/go.mod h1:0iFKpOs1y4lbCxeOmq3Xx/0AcQoewVPwj62eRluioEo= yunion.io/x/sqlchemy v1.1.3-0.20250925091009-4ca0766fc8f0 h1:L4zE6kTD1PEki1jQnLLBiYnEYFKWa/weoful0Sl4tKw= diff --git a/vendor/modules.txt b/vendor/modules.txt index 6b0ba2d095..40b4d5d6f9 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1605,7 +1605,7 @@ sigs.k8s.io/structured-merge-diff/v4/value # sigs.k8s.io/yaml v1.2.0 ## explicit; go 1.12 sigs.k8s.io/yaml -# yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20251024142004-e98de79fcabf +# yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20251029114425-e74e51b2ee51 ## explicit; go 1.21 yunion.io/x/cloudmux/pkg/apis yunion.io/x/cloudmux/pkg/apis/billing @@ -1700,7 +1700,7 @@ yunion.io/x/log/hooks yunion.io/x/ovsdb/cli_util yunion.io/x/ovsdb/schema/ovn_nb yunion.io/x/ovsdb/types -# yunion.io/x/pkg v1.10.4-0.20250820035218-6008459eb4f0 +# yunion.io/x/pkg v1.10.4-0.20251029085629-5e6cd5e0d3ad ## explicit; go 1.18 yunion.io/x/pkg/appctx yunion.io/x/pkg/errors diff --git a/vendor/yunion.io/x/cloudmux/pkg/cloudprovider/resources.go b/vendor/yunion.io/x/cloudmux/pkg/cloudprovider/resources.go index a2642bd814..26cac383c3 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/cloudprovider/resources.go +++ b/vendor/yunion.io/x/cloudmux/pkg/cloudprovider/resources.go @@ -342,8 +342,6 @@ type ICloudVM interface { GetInternetMaxBandwidthOut() int GetThroughput() int - // GetStatus() string - // GetRemoteStatus() string GetSerialOutput(port int) (string, error) // 目前仅谷歌云windows机器会使用到此接口 diff --git a/vendor/yunion.io/x/cloudmux/pkg/cloudprovider/waitstatus.go b/vendor/yunion.io/x/cloudmux/pkg/cloudprovider/waitstatus.go index be7a6db6da..97542573b7 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/cloudprovider/waitstatus.go +++ b/vendor/yunion.io/x/cloudmux/pkg/cloudprovider/waitstatus.go @@ -22,22 +22,23 @@ import ( ) func WaitStatusWithSync(res ICloudResource, expect string, sync func(status string), interval time.Duration, timeout time.Duration) error { - startTime := time.Now() + startTime, status := time.Now(), res.GetStatus() for time.Since(startTime) < timeout { err := res.Refresh() if err != nil { - return err + return errors.Wrapf(err, "Refresh") } - log.Infof("%s status %s expect %s", res.GetName(), res.GetStatus(), expect) + status = res.GetStatus() + log.Infof("%s status %s expect %s", res.GetName(), status, expect) if sync != nil { - sync(res.GetStatus()) + sync(status) } if res.GetStatus() == expect { return nil } time.Sleep(interval) } - return ErrTimeout + return errors.Wrapf(errors.ErrTimeout, "status %s expect %s", status, expect) } func WaitStatus(res ICloudResource, expect string, interval time.Duration, timeout time.Duration) error { @@ -45,14 +46,14 @@ func WaitStatus(res ICloudResource, expect string, interval time.Duration, timeo } func WaitMultiStatusWithSync(res ICloudResource, expects []string, sync func(string), interval time.Duration, timeout time.Duration) error { - startTime := time.Now() + startTime, status := time.Now(), res.GetStatus() for time.Since(startTime) < timeout { err := res.Refresh() if err != nil { - return errors.Wrap(err, "resource.Refresh()") + return errors.Wrapf(err, "Refresh") } - status := res.GetStatus() - log.Infof("%s status %s expect %s", res.GetName(), status, expects) + status = res.GetStatus() + log.Infof("%s status %s expect %v", res.GetName(), status, expects) if sync != nil { sync(status) } @@ -63,7 +64,7 @@ func WaitMultiStatusWithSync(res ICloudResource, expects []string, sync func(str } time.Sleep(interval) } - return errors.Wrap(errors.ErrTimeout, "WaitMultistatus") + return errors.Wrapf(errors.ErrTimeout, "status %s expect %v", status, expects) } func WaitMultiStatus(res ICloudResource, expects []string, interval time.Duration, timeout time.Duration) error { @@ -76,14 +77,15 @@ func WaitStatusWithDelay(res ICloudResource, expect string, delay time.Duration, } func WaitStatusWithInstanceErrorCheck(res ICloudResource, expect string, interval time.Duration, timeout time.Duration, errCheck func() error) error { - startTime := time.Now() + startTime, status := time.Now(), res.GetStatus() for time.Since(startTime) < timeout { err := res.Refresh() if err != nil { - return err + return errors.Wrapf(err, "Refresh") } - log.Infof("%s status %s expect %s", res.GetName(), res.GetStatus(), expect) - if res.GetStatus() == expect { + status = res.GetStatus() + log.Infof("%s status %s expect %s", res.GetName(), status, expect) + if status == expect { return nil } err = errCheck() @@ -92,7 +94,7 @@ func WaitStatusWithInstanceErrorCheck(res ICloudResource, expect string, interva } time.Sleep(interval) } - return ErrTimeout + return errors.Wrapf(errors.ErrTimeout, "status %s expect %s", status, expect) } func WaitDeletedWithDelay(res ICloudResource, delay time.Duration, interval time.Duration, timeout time.Duration) error { @@ -108,7 +110,7 @@ func WaitDeleted(res ICloudResource, interval time.Duration, timeout time.Durati if errors.Cause(err) == ErrNotFound { return nil } else { - return err + return errors.Wrapf(err, "Refresh") } } time.Sleep(interval) diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/instance.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/instance.go index b7a38d172b..620d5cb8d6 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/instance.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/instance.go @@ -418,66 +418,25 @@ func (self *SInstance) GetHealthStatus() string { func (self *SInstance) Refresh() error { ins, err := self.host.zone.region.GetInstance(self.InstanceId) if err != nil { - return err + return errors.Wrapf(err, "GetInstance %s", self.InstanceId) } return jsonutils.Update(self, ins) } -/* -func (self *SInstance) GetRemoteStatus() string { - // Running:运行中 - //Starting:启动中 - //Stopping:停止中 - //Stopped:已停止 - switch self.Status { - case InstanceStatusRunning: - return cloudprovider.CloudVMStatusRunning - case InstanceStatusStarting: - return cloudprovider.CloudVMStatusStopped - case InstanceStatusStopping: - return cloudprovider.CloudVMStatusRunning - case InstanceStatusStopped: - return cloudprovider.CloudVMStatusStopped - default: - return cloudprovider.CloudVMStatusOther - } -} -*/ - func (self *SInstance) GetHypervisor() string { return api.HYPERVISOR_ALIYUN } func (self *SInstance) StartVM(ctx context.Context) error { - timeout := 300 * time.Second - interval := 15 * time.Second - - startTime := time.Now() - for time.Now().Sub(startTime) < timeout { - err := self.Refresh() - if err != nil { - return err - } - log.Debugf("status %s expect %s", self.GetStatus(), api.VM_RUNNING) - if self.GetStatus() == api.VM_RUNNING { - return nil - } else if self.GetStatus() == api.VM_READY { - err := self.host.zone.region.StartVM(self.InstanceId) - if err != nil { - return err - } - } - time.Sleep(interval) - } - return cloudprovider.ErrTimeout + return self.host.zone.region.StartVM(self.InstanceId) } func (self *SInstance) StopVM(ctx context.Context, opts *cloudprovider.ServerStopOptions) error { err := self.host.zone.region.StopVM(self.InstanceId, opts.IsForce, opts.StopCharging) if err != nil { - return err + return errors.Wrapf(err, "StopVM %s", self.InstanceId) } - return cloudprovider.WaitStatus(self, api.VM_READY, 10*time.Second, 300*time.Second) // 5mintues + return cloudprovider.WaitStatus(self, api.VM_READY, 10*time.Second, 5*time.Minute) } func (self *SInstance) GetVNCInfo(input *cloudprovider.ServerVncInput) (*cloudprovider.ServerVncOutput, error) { @@ -789,12 +748,10 @@ func (self *SRegion) doDeleteVM(instanceId string) error { func (self *SRegion) StartVM(instanceId string) error { status, err := self.GetInstanceStatus(instanceId) if err != nil { - log.Errorf("Fail to get instance status on StartVM: %s", err) - return err + return errors.Wrapf(err, "GetInstanceStatus") } if status != InstanceStatusStopped { - log.Errorf("StartVM: vm status is %s expect %s", status, InstanceStatusStopped) - return cloudprovider.ErrInvalidStatus + return errors.Wrapf(cloudprovider.ErrInvalidStatus, "vm status is %s expect %s", status, InstanceStatusStopped) } return self.doStartVM(instanceId) } @@ -802,15 +759,13 @@ func (self *SRegion) StartVM(instanceId string) error { func (self *SRegion) StopVM(instanceId string, isForce, stopCharging bool) error { status, err := self.GetInstanceStatus(instanceId) if err != nil { - log.Errorf("Fail to get instance status on StopVM: %s", err) - return err + return errors.Wrapf(err, "GetInstanceStatus") } if status == InstanceStatusStopped { return nil } if status != InstanceStatusRunning { - log.Errorf("StopVM: vm status is %s expect %s", status, InstanceStatusRunning) - return cloudprovider.ErrInvalidStatus + return errors.Wrapf(cloudprovider.ErrInvalidStatus, "vm status is %s expect %s", status, InstanceStatusRunning) } return self.doStopVM(instanceId, isForce, stopCharging) } @@ -818,10 +773,8 @@ func (self *SRegion) StopVM(instanceId string, isForce, stopCharging bool) error func (self *SRegion) DeleteVM(instanceId string) error { status, err := self.GetInstanceStatus(instanceId) if err != nil { - log.Errorf("Fail to get instance status on DeleteVM: %s", err) - return err + return errors.Wrapf(err, "GetInstanceStatus") } - log.Debugf("Instance status on delete is %s", status) if status != InstanceStatusStopped { log.Warningf("DeleteVM: vm status is %s expect %s", status, InstanceStatusStopped) } @@ -831,14 +784,14 @@ func (self *SRegion) DeleteVM(instanceId string) error { func (self *SRegion) DeployVM(instanceId string, opts *cloudprovider.SInstanceDeployOptions) error { instance, err := self.GetInstance(instanceId) if err != nil { - return err + return errors.Wrapf(err, "GetInstance") } // 修改密钥时直接返回 if opts.DeleteKeypair { err = self.DetachKeyPair(instanceId, instance.KeyPairName) if err != nil { - return err + return errors.Wrapf(err, "DetachKeyPair") } } @@ -847,11 +800,11 @@ func (self *SRegion) DeployVM(instanceId string, opts *cloudprovider.SInstanceDe var err error keypairName, err = self.syncKeypair(opts.PublicKey) if err != nil { - return err + return errors.Wrapf(err, "syncKeypair") } err = self.AttachKeypair(instanceId, keypairName) if err != nil { - return err + return errors.Wrapf(err, "AttachKeypair") } } @@ -880,7 +833,7 @@ func (self *SInstance) DeleteVM(ctx context.Context) error { } e, ok := errors.Cause(err).(*alierr.ServerError) if !ok { - return err + return errors.Wrapf(err, "DeleteVM") } switch e.ErrorCode() { case "IncorrectInstanceStatus.Initializing": @@ -888,7 +841,7 @@ func (self *SInstance) DeleteVM(ctx context.Context) error { case "LastTokenProcessing": // 等待转换按量付费完成 time.Sleep(10 * time.Second) default: - return err + return errors.Wrapf(err, "DeleteVM") } } return cloudprovider.WaitDeleted(self, 10*time.Second, 300*time.Second) // 5minutes @@ -943,9 +896,8 @@ func (self *SRegion) ReplaceSystemDisk(instanceId string, imageId string, passwd } body, err := self.ecsRequest("ReplaceSystemDisk", params) if err != nil { - return "", err + return "", errors.Wrapf(err, "ReplaceSystemDisk") } - // log.Debugf("%s", body.String()) return body.GetString("DiskId") } @@ -1057,7 +1009,7 @@ func (region *SRegion) ModifyInstanceChargeType(vmId string, billingType string) } _, err := region.ecsRequest("ModifyInstanceChargeType", params) if err != nil { - return err + return errors.Wrapf(err, "ModifyInstanceChargeType %v", params) } if billingType == billing_api.BILLING_TYPE_PREPAID { cycle := billing.SBillingCycle{ @@ -1122,13 +1074,12 @@ func (region *SRegion) RenewInstance(instanceId string, bc billing.SBillingCycle params["InstanceId"] = instanceId err := billingCycle2Params(&bc, params) if err != nil { - return err + return errors.Wrapf(err, "billingCycle2Params %v", params) } params["ClientToken"] = utils.GenRequestId(20) _, err = region.ecsRequest("RenewInstance", params) if err != nil { - log.Errorf("RenewInstance fail %s", err) - return err + return errors.Wrapf(err, "RenewInstance %v", params) } return nil } diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/secgrouprule.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/secgrouprule.go index 96e42e40b0..147c1f7fc0 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/secgrouprule.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/secgrouprule.go @@ -20,6 +20,7 @@ import ( "time" "yunion.io/x/cloudmux/pkg/cloudprovider" + "yunion.io/x/pkg/util/netutils" "yunion.io/x/pkg/util/secrules" "yunion.io/x/pkg/utils" ) @@ -127,7 +128,7 @@ func (self *SPermission) Delete() error { } func (self *SPermission) Update(opts *cloudprovider.SecurityGroupRuleUpdateOptions) error { - return self.region.UpdateSecurityGroupRule(self.SecurityGroupId, self.SecurityGroupRuleId, self.GetDirection(), opts.Desc) + return self.region.UpdateSecurityGroupRule(self.SecurityGroupId, self.SecurityGroupRuleId, self.GetDirection(), opts) } func (self *SRegion) GetSecurityGroupRules(id string) ([]SPermission, error) { @@ -170,15 +171,59 @@ func (self *SRegion) DeleteSecurityGroupRule(groupId string, direction secrules. return err } -func (self *SRegion) UpdateSecurityGroupRule(groupId, ruleId string, direction secrules.TSecurityRuleDirection, desc string) error { +func (self *SRegion) UpdateSecurityGroupRule(groupId, ruleId string, direction secrules.TSecurityRuleDirection, opts *cloudprovider.SecurityGroupRuleUpdateOptions) error { params := map[string]string{ "ClientToken": utils.GenRequestId(20), "SecurityGroupId": groupId, "SecurityGroupRuleId": ruleId, } + if len(opts.Desc) > 0 { + params["Description"] = opts.Desc + } + switch opts.Protocol { + case secrules.PROTO_TCP, secrules.PROTO_UDP: + params["IpProtocol"] = opts.Protocol + if len(opts.Ports) > 0 { + params["PortRange"] = fmt.Sprintf("%s/%s", opts.Ports, opts.Ports) + if strings.Contains(opts.Ports, "-") { + params["PortRange"] = strings.ReplaceAll(opts.Ports, "-", "/") + } + } + case secrules.PROTO_ICMP: + params["IpProtocol"] = "icmp" + case secrules.PROTO_ANY: + params["IpProtocol"] = "all" + } + + if opts.Priority > 0 { + params["Priority"] = fmt.Sprintf("%d", opts.Priority) + } + + switch opts.Action { + case secrules.SecurityRuleAllow: + params["Policy"] = "accept" + case secrules.SecurityRuleDeny: + params["Policy"] = "drop" + } action := "ModifySecurityGroupRule" - if direction == secrules.DIR_OUT { + switch direction { + case secrules.DIR_IN: + if len(opts.CIDR) > 0 { + if _, err := netutils.NewIPV6Prefix(opts.CIDR); err == nil { + params["Ipv6SourceCidrIp"] = opts.CIDR + } else { + params["SourceCidrIp"] = opts.CIDR + } + } + case secrules.DIR_OUT: action = "ModifySecurityGroupEgressRule" + if len(opts.CIDR) > 0 { + if _, err := netutils.NewIPV6Prefix(opts.CIDR); err == nil { + params["Ipv6DestCidrIp"] = opts.CIDR + } else { + params["DestCidrIp"] = opts.CIDR + } + } } _, err := self.ecsRequest(action, params) return err diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/apsara/instance.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/apsara/instance.go index e9ae0f8237..277be6a8e8 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/apsara/instance.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/apsara/instance.go @@ -361,27 +361,6 @@ func (self *SInstance) Refresh() error { return jsonutils.Update(self, new) } -/* -func (self *SInstance) GetRemoteStatus() string { - // Running:运行中 - //Starting:启动中 - //Stopping:停止中 - //Stopped:已停止 - switch self.Status { - case InstanceStatusRunning: - return cloudprovider.CloudVMStatusRunning - case InstanceStatusStarting: - return cloudprovider.CloudVMStatusStopped - case InstanceStatusStopping: - return cloudprovider.CloudVMStatusRunning - case InstanceStatusStopped: - return cloudprovider.CloudVMStatusStopped - default: - return cloudprovider.CloudVMStatusOther - } -} -*/ - func (self *SInstance) GetHypervisor() string { return api.HYPERVISOR_APSARA } diff --git a/vendor/yunion.io/x/pkg/util/httputils/httputils.go b/vendor/yunion.io/x/pkg/util/httputils/httputils.go index 554172f75c..87c9e86fe3 100644 --- a/vendor/yunion.io/x/pkg/util/httputils/httputils.go +++ b/vendor/yunion.io/x/pkg/util/httputils/httputils.go @@ -175,7 +175,7 @@ func (req *JsonBaseRequest) GetHttpMethod() THttpMethod { } func (req *JsonBaseRequest) GetRequestBody() jsonutils.JSONObject { - if req.params != nil { + if !gotypes.IsNil(req.params) { return jsonutils.Marshal(req.params) } return nil