diff --git a/go.mod b/go.mod index c8130e178..d39907918 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/aws/smithy-go v1.1.0 github.com/dustin/go-humanize v1.0.1 github.com/exoscale/egoscale v0.102.4 - github.com/exoscale/egoscale/v3 v3.1.8-0.20241016080528-0a04c8745bca + github.com/exoscale/egoscale/v3 v3.1.8-0.20241030091536-ae458f356181 github.com/exoscale/openapi-cli-generator v1.1.0 github.com/fatih/camelcase v1.0.0 github.com/google/uuid v1.4.0 diff --git a/go.sum b/go.sum index ec3b95f18..e1279ae1e 100644 --- a/go.sum +++ b/go.sum @@ -197,8 +197,8 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= github.com/exoscale/egoscale v0.102.4 h1:GBKsZMIOzwBfSu+4ZmWka3Ejf2JLiaBDHp4CQUgvp2E= github.com/exoscale/egoscale v0.102.4/go.mod h1:ROSmPtle0wvf91iLZb09++N/9BH2Jo9XxIpAEumvocA= -github.com/exoscale/egoscale/v3 v3.1.8-0.20241016080528-0a04c8745bca h1:oZsrZbq/0qfm1t7DTLFiRIP+wxPg/z04yBJ4qo3U1Ow= -github.com/exoscale/egoscale/v3 v3.1.8-0.20241016080528-0a04c8745bca/go.mod h1:GHKucK/J26v8PGWztGdhxWNMjrjG9PbelxKCJ4YI11Q= +github.com/exoscale/egoscale/v3 v3.1.8-0.20241030091536-ae458f356181 h1:kg7eYWVEMjIdj9bKd+ajZ/AEqHG5zbweTTmsTUaFISI= +github.com/exoscale/egoscale/v3 v3.1.8-0.20241030091536-ae458f356181/go.mod h1:GHKucK/J26v8PGWztGdhxWNMjrjG9PbelxKCJ4YI11Q= github.com/exoscale/openapi-cli-generator v1.1.0 h1:fYjmPqHR5vxlOBrbvde7eo7bISNQIFxsGn4A5/acwKA= github.com/exoscale/openapi-cli-generator v1.1.0/go.mod h1:TZBnbT7f3hJ5ImyUphJwRM+X5xF/zCQZ6o8a42gQeTs= github.com/fatih/camelcase v1.0.0 h1:hxNvNX/xYBp0ovncs8WyWZrOrpBNub/JfaMvbURyft8= diff --git a/vendor/github.com/exoscale/egoscale/v3/README.md b/vendor/github.com/exoscale/egoscale/v3/README.md index 4c39f8f86..da648f475 100644 --- a/vendor/github.com/exoscale/egoscale/v3/README.md +++ b/vendor/github.com/exoscale/egoscale/v3/README.md @@ -93,6 +93,7 @@ fmt.Println(pool.Name) From the root repo ```Bash +make pull-oapi-spec # Optional(to pull latest Exoscale Open-API spec) make generate ``` diff --git a/vendor/github.com/exoscale/egoscale/v3/operations.go b/vendor/github.com/exoscale/egoscale/v3/operations.go index 298a89aec..49e684a71 100644 --- a/vendor/github.com/exoscale/egoscale/v3/operations.go +++ b/vendor/github.com/exoscale/egoscale/v3/operations.go @@ -18,11 +18,19 @@ type ListAntiAffinityGroupsResponse struct { // FindAntiAffinityGroup attempts to find an AntiAffinityGroup by nameOrID. func (l ListAntiAffinityGroupsResponse) FindAntiAffinityGroup(nameOrID string) (AntiAffinityGroup, error) { + var result []AntiAffinityGroup for i, elem := range l.AntiAffinityGroups { if string(elem.Name) == nameOrID || string(elem.ID) == nameOrID { - return l.AntiAffinityGroups[i], nil + result = append(result, l.AntiAffinityGroups[i]) } } + if len(result) == 1 { + return result[0], nil + } + + if len(result) > 1 { + return AntiAffinityGroup{}, fmt.Errorf("%q too many found in ListAntiAffinityGroupsResponse: %w", nameOrID, ErrConflict) + } return AntiAffinityGroup{}, fmt.Errorf("%q not found in ListAntiAffinityGroupsResponse: %w", nameOrID, ErrNotFound) } @@ -223,11 +231,19 @@ type ListAPIKeysResponse struct { // FindIAMAPIKey attempts to find an IAMAPIKey by nameOrKey. func (l ListAPIKeysResponse) FindIAMAPIKey(nameOrKey string) (IAMAPIKey, error) { + var result []IAMAPIKey for i, elem := range l.APIKeys { if string(elem.Name) == nameOrKey || string(elem.Key) == nameOrKey { - return l.APIKeys[i], nil + result = append(result, l.APIKeys[i]) } } + if len(result) == 1 { + return result[0], nil + } + + if len(result) > 1 { + return IAMAPIKey{}, fmt.Errorf("%q too many found in ListAPIKeysResponse: %w", nameOrKey, ErrConflict) + } return IAMAPIKey{}, fmt.Errorf("%q not found in ListAPIKeysResponse: %w", nameOrKey, ErrNotFound) } @@ -428,11 +444,19 @@ type ListBlockStorageVolumesResponse struct { // FindBlockStorageVolume attempts to find an BlockStorageVolume by nameOrID. func (l ListBlockStorageVolumesResponse) FindBlockStorageVolume(nameOrID string) (BlockStorageVolume, error) { + var result []BlockStorageVolume for i, elem := range l.BlockStorageVolumes { if string(elem.Name) == nameOrID || string(elem.ID) == nameOrID { - return l.BlockStorageVolumes[i], nil + result = append(result, l.BlockStorageVolumes[i]) } } + if len(result) == 1 { + return result[0], nil + } + + if len(result) > 1 { + return BlockStorageVolume{}, fmt.Errorf("%q too many found in ListBlockStorageVolumesResponse: %w", nameOrID, ErrConflict) + } return BlockStorageVolume{}, fmt.Errorf("%q not found in ListBlockStorageVolumesResponse: %w", nameOrID, ErrNotFound) } @@ -565,11 +589,19 @@ type ListBlockStorageSnapshotsResponse struct { // FindBlockStorageSnapshot attempts to find an BlockStorageSnapshot by nameOrID. func (l ListBlockStorageSnapshotsResponse) FindBlockStorageSnapshot(nameOrID string) (BlockStorageSnapshot, error) { + var result []BlockStorageSnapshot for i, elem := range l.BlockStorageSnapshots { if string(elem.Name) == nameOrID || string(elem.ID) == nameOrID { - return l.BlockStorageSnapshots[i], nil + result = append(result, l.BlockStorageSnapshots[i]) } } + if len(result) == 1 { + return result[0], nil + } + + if len(result) > 1 { + return BlockStorageSnapshot{}, fmt.Errorf("%q too many found in ListBlockStorageSnapshotsResponse: %w", nameOrID, ErrConflict) + } return BlockStorageSnapshot{}, fmt.Errorf("%q not found in ListBlockStorageSnapshotsResponse: %w", nameOrID, ErrNotFound) } @@ -2342,11 +2374,19 @@ type ListDBAASExternalEndpointsResponse struct { // FindDBAASExternalEndpoint attempts to find an DBAASExternalEndpoint by nameOrID. func (l ListDBAASExternalEndpointsResponse) FindDBAASExternalEndpoint(nameOrID string) (DBAASExternalEndpoint, error) { + var result []DBAASExternalEndpoint for i, elem := range l.DBAASEndpoints { if string(elem.Name) == nameOrID || string(elem.ID) == nameOrID { - return l.DBAASEndpoints[i], nil + result = append(result, l.DBAASEndpoints[i]) } } + if len(result) == 1 { + return result[0], nil + } + + if len(result) > 1 { + return DBAASExternalEndpoint{}, fmt.Errorf("%q too many found in ListDBAASExternalEndpointsResponse: %w", nameOrID, ErrConflict) + } return DBAASExternalEndpoint{}, fmt.Errorf("%q not found in ListDBAASExternalEndpointsResponse: %w", nameOrID, ErrNotFound) } @@ -7264,11 +7304,19 @@ type ListDBAASServicesResponse struct { // FindDBAASServiceCommon attempts to find an DBAASServiceCommon by name. func (l ListDBAASServicesResponse) FindDBAASServiceCommon(name string) (DBAASServiceCommon, error) { + var result []DBAASServiceCommon for i, elem := range l.DBAASServices { if string(elem.Name) == name { - return l.DBAASServices[i], nil + result = append(result, l.DBAASServices[i]) } } + if len(result) == 1 { + return result[0], nil + } + + if len(result) > 1 { + return DBAASServiceCommon{}, fmt.Errorf("%q too many found in ListDBAASServicesResponse: %w", name, ErrConflict) + } return DBAASServiceCommon{}, fmt.Errorf("%q not found in ListDBAASServicesResponse: %w", name, ErrNotFound) } @@ -7452,11 +7500,19 @@ type ListDBAASServiceTypesResponse struct { // FindDBAASServiceType attempts to find an DBAASServiceType by name. func (l ListDBAASServiceTypesResponse) FindDBAASServiceType(name string) (DBAASServiceType, error) { + var result []DBAASServiceType for i, elem := range l.DBAASServiceTypes { if string(elem.Name) == name { - return l.DBAASServiceTypes[i], nil + result = append(result, l.DBAASServiceTypes[i]) } } + if len(result) == 1 { + return result[0], nil + } + + if len(result) > 1 { + return DBAASServiceType{}, fmt.Errorf("%q too many found in ListDBAASServiceTypesResponse: %w", name, ErrConflict) + } return DBAASServiceType{}, fmt.Errorf("%q not found in ListDBAASServiceTypesResponse: %w", name, ErrNotFound) } @@ -8128,11 +8184,19 @@ type ListDeployTargetsResponse struct { // FindDeployTarget attempts to find an DeployTarget by nameOrID. func (l ListDeployTargetsResponse) FindDeployTarget(nameOrID string) (DeployTarget, error) { + var result []DeployTarget for i, elem := range l.DeployTargets { if string(elem.Name) == nameOrID || string(elem.ID) == nameOrID { - return l.DeployTargets[i], nil + result = append(result, l.DeployTargets[i]) } } + if len(result) == 1 { + return result[0], nil + } + + if len(result) > 1 { + return DeployTarget{}, fmt.Errorf("%q too many found in ListDeployTargetsResponse: %w", nameOrID, ErrConflict) + } return DeployTarget{}, fmt.Errorf("%q not found in ListDeployTargetsResponse: %w", nameOrID, ErrNotFound) } @@ -8231,11 +8295,19 @@ type ListDNSDomainsResponse struct { // FindDNSDomain attempts to find an DNSDomain by idOrUnicodeName. func (l ListDNSDomainsResponse) FindDNSDomain(idOrUnicodeName string) (DNSDomain, error) { + var result []DNSDomain for i, elem := range l.DNSDomains { if string(elem.ID) == idOrUnicodeName || string(elem.UnicodeName) == idOrUnicodeName { - return l.DNSDomains[i], nil + result = append(result, l.DNSDomains[i]) } } + if len(result) == 1 { + return result[0], nil + } + + if len(result) > 1 { + return DNSDomain{}, fmt.Errorf("%q too many found in ListDNSDomainsResponse: %w", idOrUnicodeName, ErrConflict) + } return DNSDomain{}, fmt.Errorf("%q not found in ListDNSDomainsResponse: %w", idOrUnicodeName, ErrNotFound) } @@ -8347,11 +8419,19 @@ type ListDNSDomainRecordsResponse struct { // FindDNSDomainRecord attempts to find an DNSDomainRecord by nameOrID. func (l ListDNSDomainRecordsResponse) FindDNSDomainRecord(nameOrID string) (DNSDomainRecord, error) { + var result []DNSDomainRecord for i, elem := range l.DNSDomainRecords { if string(elem.Name) == nameOrID || string(elem.ID) == nameOrID { - return l.DNSDomainRecords[i], nil + result = append(result, l.DNSDomainRecords[i]) } } + if len(result) == 1 { + return result[0], nil + } + + if len(result) > 1 { + return DNSDomainRecord{}, fmt.Errorf("%q too many found in ListDNSDomainRecordsResponse: %w", nameOrID, ErrConflict) + } return DNSDomainRecord{}, fmt.Errorf("%q not found in ListDNSDomainRecordsResponse: %w", nameOrID, ErrNotFound) } @@ -8776,11 +8856,19 @@ type ListElasticIPSResponse struct { // FindElasticIP attempts to find an ElasticIP by idOrIP. func (l ListElasticIPSResponse) FindElasticIP(idOrIP string) (ElasticIP, error) { + var result []ElasticIP for i, elem := range l.ElasticIPS { if string(elem.ID) == idOrIP || string(elem.IP) == idOrIP { - return l.ElasticIPS[i], nil + result = append(result, l.ElasticIPS[i]) } } + if len(result) == 1 { + return result[0], nil + } + + if len(result) > 1 { + return ElasticIP{}, fmt.Errorf("%q too many found in ListElasticIPSResponse: %w", idOrIP, ErrConflict) + } return ElasticIP{}, fmt.Errorf("%q not found in ListElasticIPSResponse: %w", idOrIP, ErrNotFound) } @@ -9375,11 +9463,19 @@ type ListIAMRolesResponse struct { // FindIAMRole attempts to find an IAMRole by nameOrID. func (l ListIAMRolesResponse) FindIAMRole(nameOrID string) (IAMRole, error) { + var result []IAMRole for i, elem := range l.IAMRoles { if string(elem.Name) == nameOrID || string(elem.ID) == nameOrID { - return l.IAMRoles[i], nil + result = append(result, l.IAMRoles[i]) } } + if len(result) == 1 { + return result[0], nil + } + + if len(result) > 1 { + return IAMRole{}, fmt.Errorf("%q too many found in ListIAMRolesResponse: %w", nameOrID, ErrConflict) + } return IAMRole{}, fmt.Errorf("%q not found in ListIAMRolesResponse: %w", nameOrID, ErrNotFound) } @@ -9738,11 +9834,19 @@ type ListInstancesResponse struct { // FindListInstancesResponseInstances attempts to find an ListInstancesResponseInstances by nameOrID. func (l ListInstancesResponse) FindListInstancesResponseInstances(nameOrID string) (ListInstancesResponseInstances, error) { + var result []ListInstancesResponseInstances for i, elem := range l.Instances { if string(elem.Name) == nameOrID || string(elem.ID) == nameOrID { - return l.Instances[i], nil + result = append(result, l.Instances[i]) } } + if len(result) == 1 { + return result[0], nil + } + + if len(result) > 1 { + return ListInstancesResponseInstances{}, fmt.Errorf("%q too many found in ListInstancesResponse: %w", nameOrID, ErrConflict) + } return ListInstancesResponseInstances{}, fmt.Errorf("%q not found in ListInstancesResponse: %w", nameOrID, ErrNotFound) } @@ -9911,11 +10015,19 @@ type ListInstancePoolsResponse struct { // FindInstancePool attempts to find an InstancePool by nameOrID. func (l ListInstancePoolsResponse) FindInstancePool(nameOrID string) (InstancePool, error) { + var result []InstancePool for i, elem := range l.InstancePools { if string(elem.Name) == nameOrID || string(elem.ID) == nameOrID { - return l.InstancePools[i], nil + result = append(result, l.InstancePools[i]) } } + if len(result) == 1 { + return result[0], nil + } + + if len(result) > 1 { + return InstancePool{}, fmt.Errorf("%q too many found in ListInstancePoolsResponse: %w", nameOrID, ErrConflict) + } return InstancePool{}, fmt.Errorf("%q not found in ListInstancePoolsResponse: %w", nameOrID, ErrNotFound) } @@ -10423,11 +10535,19 @@ type ListInstanceTypesResponse struct { // FindInstanceType attempts to find an InstanceType by id. func (l ListInstanceTypesResponse) FindInstanceType(id string) (InstanceType, error) { + var result []InstanceType for i, elem := range l.InstanceTypes { if string(elem.ID) == id { - return l.InstanceTypes[i], nil + result = append(result, l.InstanceTypes[i]) } } + if len(result) == 1 { + return result[0], nil + } + + if len(result) > 1 { + return InstanceType{}, fmt.Errorf("%q too many found in ListInstanceTypesResponse: %w", id, ErrConflict) + } return InstanceType{}, fmt.Errorf("%q not found in ListInstanceTypesResponse: %w", id, ErrNotFound) } @@ -11326,11 +11446,19 @@ type ListLoadBalancersResponse struct { // FindLoadBalancer attempts to find an LoadBalancer by nameOrID. func (l ListLoadBalancersResponse) FindLoadBalancer(nameOrID string) (LoadBalancer, error) { + var result []LoadBalancer for i, elem := range l.LoadBalancers { if string(elem.Name) == nameOrID || string(elem.ID) == nameOrID { - return l.LoadBalancers[i], nil + result = append(result, l.LoadBalancers[i]) } } + if len(result) == 1 { + return result[0], nil + } + + if len(result) > 1 { + return LoadBalancer{}, fmt.Errorf("%q too many found in ListLoadBalancersResponse: %w", nameOrID, ErrConflict) + } return LoadBalancer{}, fmt.Errorf("%q not found in ListLoadBalancersResponse: %w", nameOrID, ErrNotFound) } @@ -12036,11 +12164,19 @@ type ListPrivateNetworksResponse struct { // FindPrivateNetwork attempts to find an PrivateNetwork by nameOrID. func (l ListPrivateNetworksResponse) FindPrivateNetwork(nameOrID string) (PrivateNetwork, error) { + var result []PrivateNetwork for i, elem := range l.PrivateNetworks { if string(elem.Name) == nameOrID || string(elem.ID) == nameOrID { - return l.PrivateNetworks[i], nil + result = append(result, l.PrivateNetworks[i]) } } + if len(result) == 1 { + return result[0], nil + } + + if len(result) > 1 { + return PrivateNetwork{}, fmt.Errorf("%q too many found in ListPrivateNetworksResponse: %w", nameOrID, ErrConflict) + } return PrivateNetwork{}, fmt.Errorf("%q not found in ListPrivateNetworksResponse: %w", nameOrID, ErrNotFound) } @@ -12927,11 +13063,19 @@ type ListSecurityGroupsResponse struct { // FindSecurityGroup attempts to find an SecurityGroup by nameOrID. func (l ListSecurityGroupsResponse) FindSecurityGroup(nameOrID string) (SecurityGroup, error) { + var result []SecurityGroup for i, elem := range l.SecurityGroups { if string(elem.Name) == nameOrID || string(elem.ID) == nameOrID { - return l.SecurityGroups[i], nil + result = append(result, l.SecurityGroups[i]) } } + if len(result) == 1 { + return result[0], nil + } + + if len(result) > 1 { + return SecurityGroup{}, fmt.Errorf("%q too many found in ListSecurityGroupsResponse: %w", nameOrID, ErrConflict) + } return SecurityGroup{}, fmt.Errorf("%q not found in ListSecurityGroupsResponse: %w", nameOrID, ErrNotFound) } @@ -13522,11 +13666,19 @@ type ListSKSClustersResponse struct { // FindSKSCluster attempts to find an SKSCluster by nameOrID. func (l ListSKSClustersResponse) FindSKSCluster(nameOrID string) (SKSCluster, error) { + var result []SKSCluster for i, elem := range l.SKSClusters { if string(elem.Name) == nameOrID || string(elem.ID) == nameOrID { - return l.SKSClusters[i], nil + result = append(result, l.SKSClusters[i]) } } + if len(result) == 1 { + return result[0], nil + } + + if len(result) > 1 { + return SKSCluster{}, fmt.Errorf("%q too many found in ListSKSClustersResponse: %w", nameOrID, ErrConflict) + } return SKSCluster{}, fmt.Errorf("%q not found in ListSKSClustersResponse: %w", nameOrID, ErrNotFound) } @@ -14753,11 +14905,19 @@ type ListSnapshotsResponse struct { // FindSnapshot attempts to find an Snapshot by nameOrID. func (l ListSnapshotsResponse) FindSnapshot(nameOrID string) (Snapshot, error) { + var result []Snapshot for i, elem := range l.Snapshots { if string(elem.Name) == nameOrID || string(elem.ID) == nameOrID { - return l.Snapshots[i], nil + result = append(result, l.Snapshots[i]) } } + if len(result) == 1 { + return result[0], nil + } + + if len(result) > 1 { + return Snapshot{}, fmt.Errorf("%q too many found in ListSnapshotsResponse: %w", nameOrID, ErrConflict) + } return Snapshot{}, fmt.Errorf("%q not found in ListSnapshotsResponse: %w", nameOrID, ErrNotFound) } @@ -15008,11 +15168,19 @@ type ListSOSBucketsUsageResponse struct { // FindSOSBucketUsage attempts to find an SOSBucketUsage by name. func (l ListSOSBucketsUsageResponse) FindSOSBucketUsage(name string) (SOSBucketUsage, error) { + var result []SOSBucketUsage for i, elem := range l.SOSBucketsUsage { if string(elem.Name) == name { - return l.SOSBucketsUsage[i], nil + result = append(result, l.SOSBucketsUsage[i]) } } + if len(result) == 1 { + return result[0], nil + } + + if len(result) > 1 { + return SOSBucketUsage{}, fmt.Errorf("%q too many found in ListSOSBucketsUsageResponse: %w", name, ErrConflict) + } return SOSBucketUsage{}, fmt.Errorf("%q not found in ListSOSBucketsUsageResponse: %w", name, ErrNotFound) } @@ -15131,11 +15299,19 @@ type ListSSHKeysResponse struct { // FindSSHKey attempts to find an SSHKey by nameOrFingerprint. func (l ListSSHKeysResponse) FindSSHKey(nameOrFingerprint string) (SSHKey, error) { + var result []SSHKey for i, elem := range l.SSHKeys { if string(elem.Name) == nameOrFingerprint || string(elem.Fingerprint) == nameOrFingerprint { - return l.SSHKeys[i], nil + result = append(result, l.SSHKeys[i]) } } + if len(result) == 1 { + return result[0], nil + } + + if len(result) > 1 { + return SSHKey{}, fmt.Errorf("%q too many found in ListSSHKeysResponse: %w", nameOrFingerprint, ErrConflict) + } return SSHKey{}, fmt.Errorf("%q not found in ListSSHKeysResponse: %w", nameOrFingerprint, ErrNotFound) } @@ -15336,11 +15512,19 @@ type ListTemplatesResponse struct { // FindTemplate attempts to find an Template by nameOrID. func (l ListTemplatesResponse) FindTemplate(nameOrID string) (Template, error) { + var result []Template for i, elem := range l.Templates { if string(elem.Name) == nameOrID || string(elem.ID) == nameOrID { - return l.Templates[i], nil + result = append(result, l.Templates[i]) } } + if len(result) == 1 { + return result[0], nil + } + + if len(result) > 1 { + return Template{}, fmt.Errorf("%q too many found in ListTemplatesResponse: %w", nameOrID, ErrConflict) + } return Template{}, fmt.Errorf("%q not found in ListTemplatesResponse: %w", nameOrID, ErrNotFound) } @@ -15711,11 +15895,19 @@ type ListZonesResponse struct { // FindZone attempts to find an Zone by nameOrAPIEndpoint. func (l ListZonesResponse) FindZone(nameOrAPIEndpoint string) (Zone, error) { + var result []Zone for i, elem := range l.Zones { if string(elem.Name) == nameOrAPIEndpoint || string(elem.APIEndpoint) == nameOrAPIEndpoint { - return l.Zones[i], nil + result = append(result, l.Zones[i]) } } + if len(result) == 1 { + return result[0], nil + } + + if len(result) > 1 { + return Zone{}, fmt.Errorf("%q too many found in ListZonesResponse: %w", nameOrAPIEndpoint, ErrConflict) + } return Zone{}, fmt.Errorf("%q not found in ListZonesResponse: %w", nameOrAPIEndpoint, ErrNotFound) } diff --git a/vendor/modules.txt b/vendor/modules.txt index 53d29627d..1579a25c2 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -220,7 +220,7 @@ github.com/exoscale/egoscale/v2 github.com/exoscale/egoscale/v2/api github.com/exoscale/egoscale/v2/oapi github.com/exoscale/egoscale/version -# github.com/exoscale/egoscale/v3 v3.1.8-0.20241016080528-0a04c8745bca +# github.com/exoscale/egoscale/v3 v3.1.8-0.20241030091536-ae458f356181 ## explicit; go 1.22.0 github.com/exoscale/egoscale/v3 github.com/exoscale/egoscale/v3/credentials