diff --git a/Dockerfile b/Dockerfile index b1e9ab0b5..ab95930b2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -95,6 +95,10 @@ RUN apk add --no-cache openssh sshpass # Install dependancy for OCP 4.14 CLI RUN apk --update add gcompat +# Install yq +RUN wget https://github.com/mikefarah/yq/releases/download/v4.25.1/yq_linux_amd64 -O /usr/bin/yq && \ + chmod +x /usr/bin/yq + # Copy ginkgo & binaries over from previous container COPY --from=build /go/bin/ginkgo /bin/ginkgo COPY --from=build /go/src/github.com/portworx/torpedo/bin bin diff --git a/apiServer/taas/apiserver.go b/apiServer/taas/apiserver.go index 0a0ebd105..e7ab06204 100644 --- a/apiServer/taas/apiserver.go +++ b/apiServer/taas/apiserver.go @@ -33,5 +33,6 @@ func main() { router.POST("taas/stork/upgrade", utils.UpgradeStork) router.DELETE("taas/deletepod", utils.DeletePod) router.GET("taas/getpxbackupnamespace", utils.GetPxBackupNamespace) + router.POST("taas/createvolumesnapshotclass", utils.CreateVolumeSnapshotClass) log.Fatal(router.Run(":8080")) } diff --git a/apiServer/taas/utils/k8sutils.go b/apiServer/taas/utils/k8sutils.go index 8bb1b88d8..a7ce4fa93 100644 --- a/apiServer/taas/utils/k8sutils.go +++ b/apiServer/taas/utils/k8sutils.go @@ -4,6 +4,8 @@ import ( "fmt" "github.com/gin-gonic/gin" "github.com/portworx/torpedo/drivers/pds/lib" + "github.com/portworx/torpedo/pkg/log" + "github.com/portworx/torpedo/tests" v1 "k8s.io/api/core/v1" "net/http" "os/exec" @@ -117,3 +119,34 @@ func GetNodeStatus(c *gin.Context) { "DegradedNodes": degradedNodes, }) } + +// CreateVolumeSnapshotClass creates volume snapshot class +func CreateVolumeSnapshotClass(c *gin.Context) { + log.Infof("Creating volume snapshot class") + var createVolumeSnapshotClassRequest struct { + VolumeSnapshotClassName string `json:"volumeSnapshotClassName"` + Provisioner string `json:"provisioner"` + IsDefaultVolumeSnapshotClass bool `json:"isDefaultVolumeSnapshotClass"` + DeletePolicy string `json:"deletePolicy"` + } + if !checkTorpedoInit(c) { + c.JSON(http.StatusInternalServerError, gin.H{ + "error in init": fmt.Errorf("error in InitInstance()"), + }) + return + } + if err := c.BindJSON(&createVolumeSnapshotClassRequest); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error for request": err.Error()}) + return + } + if len(createVolumeSnapshotClassRequest.VolumeSnapshotClassName) == 0 || len(createVolumeSnapshotClassRequest.Provisioner) == 0 { + c.JSON(http.StatusBadRequest, gin.H{"error": "volumesnapshotclass name or provisioner cannot be empty", "vsc name": createVolumeSnapshotClassRequest.VolumeSnapshotClassName, "provisioner": createVolumeSnapshotClassRequest.Provisioner}) + return + } + _, err := tests.Inst().S.CreateVolumeSnapshotClasses(createVolumeSnapshotClassRequest.VolumeSnapshotClassName, createVolumeSnapshotClassRequest.Provisioner, createVolumeSnapshotClassRequest.IsDefaultVolumeSnapshotClass, createVolumeSnapshotClassRequest.DeletePolicy) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + c.JSON(http.StatusOK, gin.H{"message": fmt.Sprintf("VolumeSnapshotClass %v with provisioner %s and setting it as default: %v created successfully", createVolumeSnapshotClassRequest.VolumeSnapshotClassName, createVolumeSnapshotClassRequest.Provisioner, createVolumeSnapshotClassRequest.IsDefaultVolumeSnapshotClass)}) +} diff --git a/apiServer/taas/utils/torpedoutils.go b/apiServer/taas/utils/torpedoutils.go index 59470e18c..67cb1c791 100644 --- a/apiServer/taas/utils/torpedoutils.go +++ b/apiServer/taas/utils/torpedoutils.go @@ -199,7 +199,7 @@ func ScheduleAppsAndValidate(c *gin.Context) { } tests.Inst().AppList = requestBody.AppList - options := tests.CreateScheduleOptions("") + options := tests.CreateScheduleOptions(requestBody.NamespaceSuffix) context, err := tests.Inst().S.Schedule(requestBody.NamespaceSuffix, options) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) diff --git a/deployments/deploy-pxb-cloud.sh b/deployments/deploy-pxb-cloud.sh index e6b125519..cb5679743 100644 --- a/deployments/deploy-pxb-cloud.sh +++ b/deployments/deploy-pxb-cloud.sh @@ -356,9 +356,6 @@ if [ -z "${NODE_DRIVER}" ]; then fi if [ -n "${K8S_VENDOR}" ]; then case "$K8S_VENDOR" in - aks) - NODE_DRIVER="aks" - ;; oracle) NODE_DRIVER="oracle" ;; @@ -693,6 +690,10 @@ spec: value: "${S3_ENCRYPTION_POLICY}" - name: USE_GLOBAL_RULES value: "${USE_GLOBAL_RULES}" + - name: CUSTOM_REGISTRY + value: "${CUSTOM_REGISTRY}" + - name: CUSTOM_REPO + value: "${CUSTOM_REPO}" volumes: [${VOLUMES}] restartPolicy: Never serviceAccountName: torpedo-account diff --git a/deployments/deploy-ssh.sh b/deployments/deploy-ssh.sh index 3533bc90d..2bb50b75f 100755 --- a/deployments/deploy-ssh.sh +++ b/deployments/deploy-ssh.sh @@ -238,6 +238,11 @@ if [ -n "$ANTHOS_INST_PATH" ]; then ANTHOS_INST_PATH="${ANTHOS_INST_PATH}" fi +if [ -n "$ANTHOS_HOST_PATH" ]; then + ANTHOS_HOST_PATH="${ANTHOS_HOST_PATH}" +fi + + for i in $@ do case $i in @@ -249,7 +254,7 @@ case $i in esac done -echo "checking if we need to override test suite: ${TEST_SUITE}" +echo "Checking if we need to override test suite: ${TEST_SUITE}" # TODO: Remove this after all longevity jobs switch to 'bin/longevity.test' for TEST_SUITE. case $FOCUS_TESTS in @@ -317,6 +322,9 @@ TESTRESULTS_MOUNT="{ \"name\": \"testresults\", \"mountPath\": \"/testresults/\" AWS_VOLUME="{ \"name\": \"aws-volume\", \"configMap\": { \"name\": \"aws-cm\", \"items\": [{\"key\": \"credentials\", \"path\": \"credentials\"}, {\"key\": \"config\", \"path\": \"config\"}]} }" AWS_VOLUME_MOUNT="{ \"name\": \"aws-volume\", \"mountPath\": \"/root/.aws/\" }" +ANTHOS_VOLUME="{ \"name\": \"anthosdir\", \"hostPath\": { \"path\": \"${ANTHOS_HOST_PATH}\", \"type\": \"Directory\" } }" +ANTHOS_VOLUME_MOUNT="{ \"name\": \"anthosdir\", \"mountPath\": \"/anthosdir\" }" + VOLUMES="${TESTRESULTS_VOLUME}" if [ "${STORAGE_DRIVER}" == "aws" ]; then @@ -365,6 +373,11 @@ if [ -n "${TORPEDO_CUSTOM_PARAM_MOUNT}" ]; then VOLUME_MOUNTS="${VOLUME_MOUNTS},${TORPEDO_CUSTOM_PARAM_MOUNT}" fi +if [ -n "${ANTHOS_HOST_PATH}" ]; then + VOLUMES="${VOLUMES},${ANTHOS_VOLUME}" + VOLUME_MOUNTS="${VOLUME_MOUNTS},${ANTHOS_VOLUME_MOUNT}" +fi + BUSYBOX_IMG="busybox" if [ -n "${INTERNAL_DOCKER_REGISTRY}" ]; then BUSYBOX_IMG="${INTERNAL_DOCKER_REGISTRY}/busybox" @@ -497,7 +510,7 @@ spec: args: [ "--trace", "--timeout", "${TIMEOUT}", "$FAIL_FAST", - "--poll-progress-after", "10m", + "--poll-progress-after", "20m", --junit-report=$JUNIT_REPORT_PATH, "$FOCUS_ARG", "$SKIP_ARG", @@ -568,6 +581,7 @@ spec: "--torpedo-job-name=$TORPEDO_JOB_NAME", "--torpedo-job-type=$TORPEDO_JOB_TYPE", "--torpedo-skip-system-checks=$TORPEDO_SKIP_SYSTEM_CHECKS", + "--fa-secret=${FA_SECRET}", "$APP_DESTROY_TIMEOUT_ARG", "$SCALE_APP_TIMEOUT_ARG", ] @@ -797,6 +811,59 @@ spec: EOF +if [ "${RUN_GINKGO_COMMAND}" = "true" ]; then + torpedo_pod_command="ginkgo" + torpedo_pod_args=$(yq e '.spec.containers[] | select(.name == "torpedo") | .args[]' torpedo.yaml | sed 's/,$//') + + # This code removes the comma if the line ends with it. + # If the line is an empty string, it is quoted. + # Otherwise, the line is printed normally. + formatted_torpedo_pod_args=$(echo "$torpedo_pod_args" | awk '{ + if ($0 ~ /,$/) { + gsub(/,$/, "", $0); + printf "%s ", $0; + } else { + if ($0 == "") { + printf "\"\" "; + } else { + printf "%s ", $0; + } + } + }') + + torpedo_pod_ginkgo_command="$torpedo_pod_command $formatted_torpedo_pod_args" + echo "Formatted Ginkgo Command: $torpedo_pod_ginkgo_command" + + # This code skips a flag followed by an empty string ("") if the next token is another flag or if it is the end of the command. + # This is necessary because Torpedo does not handle empty strings as expected. + # Example: In the input ginkgo --trace --timeout "" --fail-fast ... --fa-secret "" + # --timeout "" is skipped because it is immediately followed by another flag --fail-fast + # --fa-secret "" is also skipped because it is the last token and followed by no other arguments. + cleaned_torpedo_pod_ginkgo_command=$(echo "$torpedo_pod_ginkgo_command" | awk ' + { + output = ""; + i = 1; + while (i <= NF) { + if ($(i) ~ /^--/ && $(i+1) == "\"\"") { + if (i+2 <= NF && $(i+2) ~ /^--/) { + i += 2; + continue; + } else if (i+2 > NF) { + i += 2; + continue; + } + } + output = output (output ? " " : "") $(i); + i++; + } + print output; + }') + echo "Cleaned Ginkgo Command: $cleaned_torpedo_pod_ginkgo_command" + + $cleaned_torpedo_pod_ginkgo_command + exit $? +fi + # If these are passed, we will create a docker config secret to use to pull images if [ ! -z $IMAGE_PULL_SERVER ] && [ ! -z $IMAGE_PULL_USERNAME ] && [ ! -z $IMAGE_PULL_PASSWORD ]; then echo "Adding Docker registry secret ..." diff --git a/drivers/backup/backup.go b/drivers/backup/backup.go index 25963dd40..f4afef89d 100644 --- a/drivers/backup/backup.go +++ b/drivers/backup/backup.go @@ -252,6 +252,11 @@ type Backup interface { WaitForBackupCompletion(ctx context.Context, backupName string, orgID string, timeout time.Duration, timeBeforeRetry time.Duration) error + // WaitForBackupPartialCompletion waits for backup to partial complete successfully + // or till timeout is reached. API should poll every `timeBeforeRetry` + WaitForBackupPartialCompletion(ctx context.Context, backupName string, orgID string, + timeout time.Duration, timeBeforeRetry time.Duration) error + // WaitForBackupDeletion waits for backup to be deleted successfully // or till timeout is reached. API should poll every `timeBeforeRetry WaitForBackupDeletion(ctx context.Context, backupName string, orgID string, diff --git a/drivers/backup/portworx/portworx.go b/drivers/backup/portworx/portworx.go index 5e5955d20..b338471e7 100644 --- a/drivers/backup/portworx/portworx.go +++ b/drivers/backup/portworx/portworx.go @@ -985,6 +985,61 @@ func (p *portworx) WaitForBackupCompletion( return nil } +// WaitForBackupPartialCompletion waits for backup to complete successfully +// or till timeout is reached. API should poll every `timeBeforeRetry` duration +func (p *portworx) WaitForBackupPartialCompletion( + ctx context.Context, + backupName, + orgID string, + timeout time.Duration, + timeBeforeRetry time.Duration, +) error { + + backupUID, err := p.GetBackupUID(ctx, backupName, orgID) + if err != nil { + return err + } + req := &api.BackupInspectRequest{ + Name: backupName, + OrgId: orgID, + Uid: backupUID, + } + var backupError error + f := func() (interface{}, bool, error) { + inspectBkpResp, err := p.backupManager.Inspect(ctx, req) + if err != nil { + // Error occured, just retry + return nil, true, err + } + + // Check if backup status is complete + currentStatus := inspectBkpResp.GetBackup().GetStatus().GetStatus() + if currentStatus == api.BackupInfo_StatusInfo_PartialSuccess { + // If backup is complete, dont retry again + return nil, false, nil + } else if currentStatus == api.BackupInfo_StatusInfo_Failed || + currentStatus == api.BackupInfo_StatusInfo_Aborted || + currentStatus == api.BackupInfo_StatusInfo_Invalid || + currentStatus == api.BackupInfo_StatusInfo_Success { + backupError = fmt.Errorf("backup [%v] is in [%s] state. reason: [%v]", + req.GetName(), currentStatus, + inspectBkpResp.GetBackup().GetStatus().GetReason()) + return nil, false, backupError + } + return nil, + true, + fmt.Errorf("backup [%v] is in [%s] state. Waiting to become Partial Complete", + req.GetName(), currentStatus) + } + + _, err = task.DoRetryWithTimeout(f, timeout, timeBeforeRetry) + if err != nil || backupError != nil { + return fmt.Errorf("failed to wait for backup. Error:[%v] Reason:[%v]", err, backupError) + } + + return nil +} + // WaitForBackupDeletion waits for backup to be deleted successfully // or till timeout is reached. API should poll every `timeBeforeRetry` duration func (p *portworx) WaitForBackupDeletion( diff --git a/drivers/node/node.go b/drivers/node/node.go index cfdd3a2e0..dd5a1ae14 100644 --- a/drivers/node/node.go +++ b/drivers/node/node.go @@ -5,6 +5,7 @@ import ( "time" "github.com/libopenstorage/openstorage/api" + corev1 "github.com/libopenstorage/operator/pkg/apis/core/v1" "github.com/portworx/torpedo/pkg/errors" ) @@ -201,12 +202,21 @@ type Driver interface { // DestroyVM powers VM DestroyVM(node Node) error + // MoveDisks moves disks from one node to another + MoveDisks(sourceNode Node, targetNode Node) error + + // RemoveNonRootDisks removes non-root disks from the node + RemoveNonRootDisks(node Node) error + // SystemctlUnitExist checks if a given service exists in a node SystemctlUnitExist(n Node, service string, options SystemctlOpts) (bool, error) // AddMachine adds the new machine instance to existing map AddMachine(machineName string) error + // DetachDisk vdisk from node. + DetachDrivesFromVM(stc *corev1.StorageCluster, nodeName string) error + // PowerOnVMByName power on the VM using the vm name PowerOnVMByName(vmName string) error @@ -284,6 +294,13 @@ func (d *notSupportedDriver) RebootNode(node Node, options RebootNodeOpts) error } } +func (d *notSupportedDriver) DetachDrivesFromVM(stc *corev1.StorageCluster, nodeName string) error { + return &errors.ErrNotSupported{ + Type: "Function", + Operation: "DetachDrivesFromVM()", + } +} + func (d *notSupportedDriver) RebootNodeAndWait(node Node) error { return &errors.ErrNotSupported{ Type: "Function", @@ -518,3 +535,17 @@ func (d *notSupportedDriver) GetSupportedDriveTypes() ([]string, error) { Operation: "GetSupportedDriveTypes()", } } + +func (d *notSupportedDriver) MoveDisks(sourceNode Node, targetNode Node) error { + return &errors.ErrNotSupported{ + Type: "Function", + Operation: "MoveDisks()", + } +} + +func (d *notSupportedDriver) RemoveNonRootDisks(node Node) error { + return &errors.ErrNotSupported{ + Type: "Function", + Operation: "RemoveNonRootDisks()", + } +} diff --git a/drivers/node/node_registry.go b/drivers/node/node_registry.go index 8af08d550..f1324c388 100644 --- a/drivers/node/node_registry.go +++ b/drivers/node/node_registry.go @@ -226,3 +226,17 @@ func GetNodeDetailsByNodeID(nodeID string) (Node, error) { } return Node{}, fmt.Errorf("failed to get Node Details by Node ID [%s] ", nodeID) } + +// GetPXDisabledNodes returns all the nodes where PX is disabled +func GetPXDisabledNodes() []Node { + var nodeList []Node + for _, n := range nodeRegistry { + if !n.IsStorageDriverInstalled { + // Ignore the control plane nodes + if !IsMasterNode(n) { + nodeList = append(nodeList, n) + } + } + } + return nodeList +} diff --git a/drivers/node/ssh/ssh.go b/drivers/node/ssh/ssh.go index 11b1806ed..b2f12bc17 100644 --- a/drivers/node/ssh/ssh.go +++ b/drivers/node/ssh/ssh.go @@ -820,7 +820,7 @@ func (s *SSH) doCmdSSH(n node.Node, options node.ConnectionOpts, cmd string, ign if ignoreErr == false && err != nil { log.Infof("SSH ERR: %v", err) return out, &node.ErrFailedToRunCommand{ - Addr: n.UsableAddr, + Addr: n.Name, Cause: fmt.Sprintf("failed to run command. sterr: %v, err: %v", sterr, err), } } @@ -839,6 +839,7 @@ func (s *SSH) getConnection(n node.Node, options node.ConnectionOpts) (*ssh_pkg. func (s *SSH) getConnectionOnUsableAddr(n node.Node, options node.ConnectionOpts) (*ssh_pkg.Client, error) { var sshErr error var cli interface{} + log.Debugf("checking for usable address in: %v for node [%s]", n.Addresses, n.Name) for _, addr := range n.Addresses { t := func() (interface{}, bool, error) { // check if address is responding on port 22 @@ -848,6 +849,7 @@ func (s *SSH) getConnectionOnUsableAddr(n node.Node, options node.ConnectionOpts } if cli, sshErr = task.DoRetryWithTimeout(t, options.Timeout, options.TimeBeforeRetry); sshErr == nil { n.UsableAddr = addr + log.Debugf("usable address: [%s] for node [%s]", n.UsableAddr, n.Name) return cli.(*ssh_pkg.Client), nil } } diff --git a/drivers/node/vsphere/vsphere.go b/drivers/node/vsphere/vsphere.go index f381069f8..9d6ff9fb6 100644 --- a/drivers/node/vsphere/vsphere.go +++ b/drivers/node/vsphere/vsphere.go @@ -2,14 +2,18 @@ package vsphere import ( "context" + "encoding/json" "fmt" - "github.com/vmware/govmomi/vim25/mo" "net/url" "os" + "path/filepath" "regexp" "strings" "time" + pxutil "github.com/libopenstorage/operator/drivers/storage/portworx/util" + corev1 "github.com/libopenstorage/operator/pkg/apis/core/v1" + coreops "github.com/portworx/sched-ops/k8s/core" "github.com/portworx/sched-ops/task" "github.com/portworx/torpedo/drivers/node" "github.com/portworx/torpedo/drivers/node/ssh" @@ -17,6 +21,7 @@ import ( "github.com/vmware/govmomi" "github.com/vmware/govmomi/find" "github.com/vmware/govmomi/object" + "github.com/vmware/govmomi/vim25/mo" "github.com/vmware/govmomi/vim25/types" ) @@ -43,6 +48,76 @@ const ( VMReadyRetryInterval = 5 * time.Second ) +type DriveSet struct { + // Configs describes the configuration of the drives present in this set + // The key is the volumeID + Configs map[string]DriveConfig + // NodeID is the id of the node where the drive set is being used/last + // used + NodeID string + // ReservedInstanceID if set is the instance ID of the node that's attempting to transfer the driveset to itself + ReservedInstanceID string + // SchedulerNodeName is the name of the node in scheduler context + SchedulerNodeName string + // NodeIndex is the index of the node where the drive set is being + // used/last used + NodeIndex int + // CreateTimestamp is the timestamp when the drive set was created + CreateTimestamp time.Time + // InstanceID is the cloud provider id of the instance using this drive set + InstanceID string + // Zone defines the zone in which the node exists + Zone string + // State state of the drive set from the well defined states + State string + // Labels associated with this drive set + Labels *map[string]string `json:"labels"` +} + +// DriveConfig defines the configuration for a cloud drive +type DriveConfig struct { + // Type defines the type of cloud drive + Type string + // Size defines the size of the cloud drive in Gi + Size int64 + // ID is the cloud drive id + ID string + // Path is the path where the drive is attached + Path string + // Iops is the iops that the drive supports + Iops int64 + // Vpus provide a measure of disk resources available for + // performance (IOPS/GBs) of Oracle drives. + // Oracle uses VPU in lieu of disk types. + Vpus int64 + // PXType indicates how this drive is being used by PX + PXType string + // State state of the drive config from the well defined states + State string + // Labels associated with this drive config + Labels map[string]string `json:"labels"` + // AttachOptions for cloud drives to be attached + AttachOptions map[string]string + // Provisioner is a name of provisioner which was used to create a drive + Provisioner string + // Encryption Key string to be passed in device specs + EncryptionKeyInfo string + // UUID of VMDK + DiskUUID string +} + +// DrivePaths stores the device paths of the disks which will be used by PX. +type DrivePaths struct { + // Storage drives + Storage []string + // Journal drive + Journal string + // Metadata drive + Metadata string + // Kvdb drive + Kvdb string +} + // Vsphere ssh driver type vsphere struct { ssh.SSH @@ -248,6 +323,139 @@ func (v *vsphere) connect() error { return nil } +// DetachDisk vdisks from node. +func (v *vsphere) DetachDrivesFromVM(stc *corev1.StorageCluster, nodeName string) error { + configData, err := GetCloudDriveConfigmapData(stc) + if err != nil { + err = fmt.Errorf("Failed to find configData: err %w", err) + return err + } + //Find out the instance VMUUID and then dettach. + for _, nodeConfigData := range configData { + if nodeName == nodeConfigData.SchedulerNodeName { + allDiskPaths := GetDiskPaths(nodeConfigData) + instanceId := nodeConfigData.InstanceID + for i := 0; i < len(allDiskPaths); i++ { + log.Infof("Diskpath for %v is %v and instance id is %v", nodeConfigData.NodeID, allDiskPaths[i], instanceId) + err = v.DetachDisk(instanceId, allDiskPaths[i]) + if err != nil { + //log.InfoD("Detach drives from the node failed %v", err) + err = fmt.Errorf("Detaching disk: %s on node %s failed: %w", allDiskPaths[i], nodeName, err) + return err + } + } + } else { + log.Infof(" Node Name from config %s, expected %s ", nodeConfigData.SchedulerNodeName, nodeName) + } + } + return nil +} + +func (v *vsphere) DetachDisk(vmUuid string, path string) error { + // Getting finder instance + f, err := v.getVMFinder() + if err != nil { + return err + } + // vmMap Reset to get the new valid VMs info. + vmMap = make(map[string]*object.VirtualMachine) + // Find virtual machines in datacenter + vms, err := f.VirtualMachineList(v.ctx, "*") + var vmMo *object.VirtualMachine + if err != nil { + return fmt.Errorf("failed to find any virtual machines on %s: %v", v.vsphereHostIP, err) + } + for _, vm := range vms { + if vm.UUID(v.ctx) == vmUuid { + //Found + vmMo = vm + log.Infof("VM found %v", vm) + break + } + } + //Error if not found + if vmMo == nil { + return fmt.Errorf("Virtual machine not found") + } + //Remove device and detach VM + var selectedDevice types.BaseVirtualDevice + deviceList, err := vmMo.Device(v.ctx) + if err != nil { + return fmt.Errorf("Failed to get the devices for VM: %q. err: %+v", vmMo, err) + } + log.Infof("All devices %v", deviceList) + // filter vm devices to retrieve device for the given vmdk file identified by disk path + for _, device := range deviceList { + if deviceList.TypeName(device) == "VirtualDisk" { + virtualDevice := device.GetVirtualDevice() + if backing, ok := virtualDevice.Backing.(*types.VirtualDiskFlatVer2BackingInfo); ok { + if matchVirtualDiskAndVolPath(backing.FileName, path) { + log.Infof("Found VirtualDisk backing with filename %q for diskPath %q", backing.FileName, path) + selectedDevice = device + } + } + } + } + if selectedDevice != nil { + log.Infof("Selected device %v", selectedDevice) + return vmMo.RemoveDevice(v.ctx, true, selectedDevice) + } + return fmt.Errorf("No device selected for VM: %q", vmMo) +} + +// Match the paths between fileNamePath and absolute vmdk path +func matchVirtualDiskAndVolPath(diskPath, volPath string) bool { + diskPath = strings.TrimSuffix(diskPath, filepath.Ext(diskPath)) + volPath = strings.TrimSuffix(volPath, filepath.Ext(volPath)) + return diskPath == volPath +} + +// Get virtual disk path. +// TODO need to filter only of type: DrivePaths +func GetDiskPaths(driveset DriveSet) []string { + diskPaths := []string{} + for vmdkPath, configs := range driveset.Configs { + //TODO need to change later + log.InfoD("PX type %s ", configs.PXType) + if configs.PXType == "data" { + diskPath := vmdkPath + datastore := GetDatastore(configs) + openBracketIndex := strings.Index(diskPath, "[") + closeBracketIndex := strings.Index(diskPath, "]") + // Extract the substring inside the square brackets + substring := diskPath[openBracketIndex+1 : closeBracketIndex] + // Replace the substring inside the square brackets with datastore + diskPath = strings.Replace(diskPath, substring, datastore, 1) + diskPaths = append(diskPaths, diskPath) + log.Infof("diskPath %s is of type data ", diskPath) + } + } + return diskPaths +} + +// GetDatastore +func GetDatastore(configs DriveConfig) string { + for key, val := range configs.Labels { + if key == "datastore" { + return val + } + } + return "" +} + +// GetCloudDriveConfigmapData Get clouddrive configMap data. +func GetCloudDriveConfigmapData(cluster *corev1.StorageCluster) (map[string]DriveSet, error) { + cloudDriveConfigmapName := pxutil.GetCloudDriveConfigMapName(cluster) + var PortworxNamespace = "kube-system" + cloudDriveConfifmap, _ := coreops.Instance().GetConfigMap(cloudDriveConfigmapName, PortworxNamespace) + var configData map[string]DriveSet + err := json.Unmarshal([]byte(cloudDriveConfifmap.Data["cloud-drive"]), &configData) + if err != nil { + return nil, err + } + return configData, nil +} + // AddVM adds a new VM object to vmMap func (v *vsphere) AddMachine(vmName string) error { var f *find.Finder @@ -270,6 +478,10 @@ func (v *vsphere) AddMachine(vmName string) error { return err } + if vmMo.Guest == nil { + return fmt.Errorf("failed to find guest info for virtual machine %s", vmName) + } + // Get the hostname hostname := vmMo.Guest.HostName log.Debugf("hostname: %v", hostname) @@ -358,7 +570,7 @@ func (v *vsphere) PowerOnVMByName(vmName string) error { // Make sure vmName is part of vmMap before using this method var err error - //Reestblish connection to avoid session timeout. + //Reestablish connection to avoid session timeout. err = v.connect() if err != nil { return err @@ -480,3 +692,116 @@ func init() { func (v *vsphere) GetSupportedDriveTypes() ([]string, error) { return []string{"thin", "zeroedthick", "eagerzeroedthick", "lazyzeroedthick"}, nil } + +// MoveDisks detaches all disks from the source VM and attaches it to the target +func (v *vsphere) MoveDisks(sourceNode node.Node, targetNode node.Node) error { + // Reestablish connection to avoid session timeout. + err := v.connect() + if err != nil { + return err + } + + sourceVM, ok := vmMap[sourceNode.Name] + if !ok { + return fmt.Errorf("could not fetch VM for node: %s", sourceNode.Name) + } + + targetVM, ok := vmMap[targetNode.Name] + if !ok { + return fmt.Errorf("could not fetch VM for node: %s", targetNode.Name) + } + + devices, err := sourceVM.Device(v.ctx) + if err != nil { + return err + } + + // Detach disks from source VM and attach to destination VM + var disks []*types.VirtualDisk + for _, device := range devices { + if disk, ok := device.(*types.VirtualDisk); ok { + // skip the first/root disk + if *disk.UnitNumber == 0 { + continue + } + disks = append(disks, disk) + + config := &types.VirtualMachineConfigSpec{ + DeviceChange: []types.BaseVirtualDeviceConfigSpec{ + &types.VirtualDeviceConfigSpec{ + Operation: types.VirtualDeviceConfigSpecOperationRemove, + Device: disk, + }, + }, + } + log.Debugf("Detaching disk %s from VM %s", disk.DeviceInfo.GetDescription().Label, sourceVM.Name()) + event, err := sourceVM.Reconfigure(v.ctx, *config) + if err != nil { + return err + } + + err = event.Wait(v.ctx) + if err != nil { + return err + } + } + } + + for _, disk := range disks { + config := &types.VirtualMachineConfigSpec{ + DeviceChange: []types.BaseVirtualDeviceConfigSpec{ + &types.VirtualDeviceConfigSpec{ + Operation: types.VirtualDeviceConfigSpecOperationAdd, + Device: disk, + }, + }, + } + log.Debugf("Attaching disk %s to VM %s", disk.DeviceInfo.GetDescription().Label, targetVM.Name()) + event, err := targetVM.Reconfigure(v.ctx, *config) + if err != nil { + return err + } + + err = event.Wait(v.ctx) + if err != nil { + return err + } + } + + return nil +} + +// RemoveNonRootDisks removes all disks except the root disk from the VM +func (v *vsphere) RemoveNonRootDisks(n node.Node) error { + // Reestablish connection to avoid session timeout. + err := v.connect() + if err != nil { + return err + } + + vm, ok := vmMap[n.Name] + if !ok { + return fmt.Errorf("could not fetch VM for node: %s", n.Name) + } + + devices, err := vm.Device(v.ctx) + if err != nil { + return err + } + + for _, device := range devices { + if disk, ok := device.(*types.VirtualDisk); ok { + // skip the first/root disk + if *disk.UnitNumber == 0 { + continue + } + log.Debugf("Deleting disk %s from VM %s", disk.DeviceInfo.GetDescription().Label, vm.Name()) + err = vm.RemoveDevice(v.ctx, false, disk) + if err != nil { + return err + } + } + } + + return nil +} \ No newline at end of file diff --git a/drivers/pure/flasharray/fa.go b/drivers/pure/flasharray/fa.go new file mode 100644 index 000000000..6df389187 --- /dev/null +++ b/drivers/pure/flasharray/fa.go @@ -0,0 +1,406 @@ +package flasharray + +import ( + "bytes" + "crypto/tls" + "encoding/json" + "errors" + "fmt" + "github.com/portworx/torpedo/pkg/log" + "io/ioutil" + "net/http" + "net/http/cookiejar" + "net/url" + "strings" + "time" +) + +// supportedRestVersions is used to negotiate the API version to use +var supportedRestVersions = [...]string{"2.2", "2.3", "2.4", "2.5", "2.6", "2.7", "2.8"} + +type Client struct { + MgmtIp string + ApiToken string + UserName string + Password string + RestVersion string + UserAgent string + AuthToken string + Kwargs map[string]string + + // Client object defined here + client *http.Client + Volumes *VolumeServices +} + +// Type supported is used for retrieving the support API versions from the Flash Array +type supported struct { + Versions []string `json:"version"` +} + +// Type auth is used to for the API token used in API authentication +type ApiToken struct { + Token string `json:"api_token,omitempty"` +} + +func (c *Client) CreateClientInstance() { + // Create Client Interface + cookieJar, _ := cookiejar.New(nil) + transport := &http.Transport{ + TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, + } + c.client = &http.Client{Transport: transport, Jar: cookieJar} +} + +func NewClient(mgmtIp string, apiToken string, userName string, password string, + restVersion string, verifyHTTPS bool, sslCert bool, + userAgent string, kwargs map[string]string) (*Client, error) { + + err := checkAuth(apiToken, userName, password) + if err != nil { + return nil, err + } + + c := &Client{MgmtIp: mgmtIp, + ApiToken: apiToken, + UserName: userName, + Password: password, + RestVersion: restVersion, + UserAgent: userAgent} + + requestKwargs := setDefaultRequestKwargs(kwargs, verifyHTTPS, sslCert) + c.Kwargs = requestKwargs + + authToken, err := c.getAuthToken(restVersion) + if err != nil { + return nil, err + } + c.AuthToken = authToken + // Create Client Instance + c.CreateClientInstance() + + // Authenticate to the API and store the session + err = c.login() + if err != nil { + return nil, err + } + + // Initialize services + c.InitializeServices() + + return c, err + +} + +// checkAuth validates +func checkAuth(apiToken string, username string, password string) error { + + if apiToken == "" && (username == "" && password == "") { + err := errors.New("[error] Must specify API token or both username and password") + return err + } + + if apiToken != "" && (username != "" && password != "") { + err := errors.New("specify only API token or both username and password") + return err + } + + return nil +} + +// Authenticate to the API and store the session +func (c *Client) login() error { + authURL := c.formatPath("auth/session", true) + data := map[string]string{"api_token": c.ApiToken} + jsonValue, _ := json.Marshal(data) + _, err := c.client.Post(authURL, "application/json", bytes.NewBuffer(jsonValue)) + if err != nil { + return err + } + return nil +} + +func (c *Client) Do(req *http.Request, v interface{}) (*http.Response, error) { + log.Infof("\nRequest [%v]\n", req) + resp, err := c.client.Do(req) + if err != nil { + log.Infof("Do request failed") + return nil, err + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("error getting auth-token,response status is [%d]", resp.StatusCode) + + } + if err := validateResponse(resp); err != nil { + return resp, err + } + + bodyBytes, _ := ioutil.ReadAll(resp.Body) + bodyString := string(bodyBytes) + err = json.Unmarshal([]byte(fmt.Sprintf("[%v]", bodyString)), v) + + if err != nil { + return nil, err + } + return resp, nil + +} + +func (c *Client) NewRequest(method string, path string, params map[string]string, data interface{}) (*http.Request, error) { + + var fpath string + if strings.HasPrefix(path, "http") { + fpath = path + } else { + fpath = c.formatPath(path, false) + } + bodyReader := bytes.NewReader([]byte{}) + baseURL, err := url.Parse(fpath) + if err != nil { + return nil, err + } + if params != nil { + ps := url.Values{} + for k, v := range params { + log.Infof("[DEBUG] key: %s, value: %s \n", k, v) + ps.Set(k, v) + } + baseURL.RawQuery = ps.Encode() + } + + log.Infof("Base URL [%v]", baseURL.String()) + + req, err := http.NewRequest(method, baseURL.String(), bodyReader) + if err != nil { + return nil, err + } + if data != nil { + jsonString, err := json.Marshal(data) + if err != nil { + return nil, err + } + req, err = http.NewRequest(method, baseURL.String(), bytes.NewBuffer(jsonString)) + if err != nil { + return nil, err + } + } + + log.Infof("Adding auth token [%v]", c.AuthToken) + req.Header.Add("x-auth-token", fmt.Sprintf("%v", c.AuthToken)) + req.Header.Add("Content-Type", "application/json") + req.Header.Add("Accept", "application/json") + if c.UserAgent != "" { + req.Header.Add("User-Agent", c.UserAgent) + } + + return req, err +} + +func (c *Client) NewGetRequests(path string, params map[string]string, data interface{}) (*http.Request, error) { + method := "GET" + httpRequest, err := c.NewRequest(method, path, params, data) + if err != nil { + return nil, err + } + return httpRequest, nil +} + +func (c *Client) getAuthToken(restVersion string) (string, error) { + + authURL, err := url.Parse(c.formatPath(fmt.Sprintf("api/%v/login", restVersion), true)) + if err != nil { + return "", err + } + log.Infof("Auth URL [%v]", authURL.String()) + + bodyReader := bytes.NewReader([]byte{}) + request, err := http.NewRequest("POST", authURL.String(), bodyReader) + if err != nil { + return "", err + } + log.Infof("API Token [%v]", c.ApiToken) + + request.Header.Add("Content-Type", "application/json") + request.Header.Add("api-token", c.ApiToken) + + log.Infof(fmt.Sprintf("API Token [%v]", c.ApiToken)) + + tempClient := &http.Client{ + // http.Client doesn't set the default Timeout, + // so it will be blocked forever without Timeout setting + Timeout: time.Second * time.Duration(10), + Transport: &http.Transport{ + TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, + }, + } + httpResponse, err := tempClient.Do(request) + if err != nil { + return "", err + } + + // Response processing + defer httpResponse.Body.Close() + if httpResponse.StatusCode != http.StatusOK { + return "", fmt.Errorf("error getting auth-token,response status is [%d]", httpResponse.StatusCode) + + } + _, err = ioutil.ReadAll(httpResponse.Body) + if err != nil { + return "", err + } + + authToken := httpResponse.Header.Get("x-auth-token") + log.Infof("Login Success!") + return authToken, nil + +} + +// formatPath returns the formated string to be used for the base URL in +// all API calls +func (c *Client) formatPath(path string, ignoreRestVersion bool) string { + formatPath := "" + if ignoreRestVersion { + formatPath = fmt.Sprintf("https://%s/%s", c.MgmtIp, path) + } else { + formatPath = fmt.Sprintf("https://%s/api/%s/%s", c.MgmtIp, c.RestVersion, path) + } + log.Infof(formatPath) + return formatPath +} + +// getJSON is just a helper function that creates and retrieves information +// from the Flash Array before the actual session is established. +// Right now, its just grabbing the supported API versions. I should +// probably find a more graceful way to accomplish this. +func getJSON(uri string, target interface{}) error { + tr := &http.Transport{ + TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, + } + var c = &http.Client{Timeout: 10 * time.Second, Transport: tr} + r, err := c.Get(uri) + if err != nil { + return err + } + defer r.Body.Close() + + return json.NewDecoder(r.Body).Decode(target) +} + +func (c *Client) InitializeServices() *Client { + + // Initialize all services created here + c.Volumes = &VolumeServices{client: c} + return c +} + +// validateResponse checks that the http response is within the 200 range. +// Some functionality needs to be added here to check for some specific errors, +// and probably add the equivlents to PureError and PureHTTPError from the Python +// REST client. +func validateResponse(r *http.Response) error { + if c := r.StatusCode; 200 <= c && c <= 299 { + return nil + } + + bodyBytes, _ := ioutil.ReadAll(r.Body) + bodyString := string(bodyBytes) + return fmt.Errorf("Response code: %d, ResponeBody: %s", r.StatusCode, bodyString) +} + +// setDefaultRequestKwargs sets default request kwargs if not provided. +func setDefaultRequestKwargs(requestKwargs map[string]string, verifyHTTPS, sslCert bool) map[string]string { + if requestKwargs == nil { + requestKwargs = make(map[string]string) + } + + if _, ok := requestKwargs["verify"]; !ok { + if sslCert && verifyHTTPS { + requestKwargs["verify"] = "false" + } else { + requestKwargs["verify"] = "true" + } + } + return requestKwargs +} + +// getRestVersion retrieves and verifies the REST API version. +func getRestVersion(restVersion string, target string) (string, error) { + if restVersion != "" { + if err := checkRestVersion(restVersion, target); err != nil { + return "", err + } + } else { + r, err := chooseRestVersion(target) + if err != nil { + return "", err + } + restVersion = r + } + log.Infof("Selected rest Version is [%v]", restVersion) + return restVersion, nil +} + +// checkRestVersion checks if the specified REST API version is supported by the FlashArray and the library. +func checkRestVersion(version string, target string) error { + // Construct the URL for checking supported API versions + checkURL := fmt.Sprintf("https://%s/api/api_version", target) + log.Infof(fmt.Sprintf("URL is [%v]", checkURL)) + // Retrieve supported API versions from the FlashArray + supported := &supported{} + err := getJSON(checkURL, supported) + if err != nil { + return err + } + + // Check if the specified version is supported by the FlashArray + arraySupported := false + for _, v := range supported.Versions { + if version == v { + arraySupported = true + break + } + } + if !arraySupported { + return errors.New("[error] Array is incompatible with REST API version " + version) + } + + // Check if the specified version is supported by the library + librarySupported := false + for _, v := range supportedRestVersions { + if version == v { + librarySupported = true + break + } + } + if !librarySupported { + return errors.New("[error] Library is incompatible with REST API version " + version) + } + + return nil +} + +// chooseRestVersion negotiates the highest REST API version supported by the library and the FlashArray. +func chooseRestVersion(target string) (string, error) { + // Construct the URL for checking supported API versions + checkURL := fmt.Sprintf("https://%s/api/api_version", target) + + // Retrieve supported API versions from the FlashArray + supported := &supported{} + err := getJSON(checkURL, supported) + if err != nil { + return "", err + } + + // Find the highest supported API version + for i := len(supported.Versions) - 1; i >= 0; i-- { + for _, version := range supportedRestVersions { + if supported.Versions[i] == version { + return version, nil + } + } + } + + // If no compatible version found, return an error + return "", errors.New("[error] Array is incompatible with all supported REST API versions") +} diff --git a/drivers/pure/flasharray/volumeTypes.go b/drivers/pure/flasharray/volumeTypes.go new file mode 100644 index 000000000..f892a96f7 --- /dev/null +++ b/drivers/pure/flasharray/volumeTypes.go @@ -0,0 +1,82 @@ +package flasharray + +type Space struct { + DataReduction float64 `json:"data_reduction"` + Shared *string `json:"shared"` + Snapshots int `json:"snapshots"` + System *string `json:"system"` + ThinProvisioning float64 `json:"thin_provisioning"` + TotalPhysical int64 `json:"total_physical"` + TotalProvisioned int64 `json:"total_provisioned"` + TotalReduction float64 `json:"total_reduction"` + Unique int64 `json:"unique"` + Virtual int64 `json:"virtual"` +} + +type Source struct { + Name *string `json:"name"` + ID *string `json:"id"` +} + +type Pod struct { + Name *string `json:"name"` + ID *string `json:"id"` +} + +type QoS struct { + BandwidthLimit uint64 `json:"bandwidth_limit"` + IopsLimit uint64 `json:"iops_limit"` +} + +type VolumeGroup struct { + Name *string `json:"name"` + ID *string `json:"id"` +} + +type Item struct { + Space Space `json:"space"` + ConnectionCount int `json:"connection_count"` + Provisioned int64 `json:"provisioned"` + Created int64 `json:"created"` + Source Source `json:"source"` + Name string `json:"name"` + ID string `json:"id"` + Serial string `json:"serial"` + Destroyed bool `json:"destroyed"` + TimeRemaining *string `json:"time_remaining"` + HostEncryptionKeyStatus string `json:"host_encryption_key_status"` + RequestedPromotionState string `json:"requested_promotion_state"` + PromotionStatus string `json:"promotion_status"` + Pod Pod `json:"pod"` + QoS QoS `json:"qos"` + Subtype string `json:"subtype"` + VolumeGroup VolumeGroup `json:"volume_group"` +} + +type Total struct { + Space Space `json:"space"` + ConnectionCount *int `json:"connection_count"` + Provisioned int64 `json:"provisioned"` + Created *int64 `json:"created"` + Source Source `json:"source"` + Name *string `json:"name"` + ID *string `json:"id"` + Serial *string `json:"serial"` + Destroyed *bool `json:"destroyed"` + TimeRemaining *string `json:"time_remaining"` + HostEncryptionKeyStatus *string `json:"host_encryption_key_status"` + RequestedPromotionState *string `json:"requested_promotion_state"` + PromotionStatus *string `json:"promotion_status"` + Pod Pod `json:"pod"` + QoS QoS `json:"qos"` + Subtype *string `json:"subtype"` + VolumeGroup VolumeGroup `json:"volume_group"` +} + +type VolResponse struct { + ContinuationToken *string `json:"continuation_token"` + Items []Item `json:"items"` + MoreItemsRemaining bool `json:"more_items_remaining"` + Total []Total `json:"total"` + TotalItemCount *int `json:"total_item_count"` +} diff --git a/drivers/pure/flasharray/volumes.go b/drivers/pure/flasharray/volumes.go new file mode 100644 index 000000000..3b9a2ccc7 --- /dev/null +++ b/drivers/pure/flasharray/volumes.go @@ -0,0 +1,18 @@ +package flasharray + +type VolumeServices struct { + client *Client +} + +func (vols *VolumeServices) ListAllAvailableVolumes(params map[string]string, data interface{}) ([]VolResponse, error) { + req, err := vols.client.NewRequest("GET", "volumes", params, data) + if err != nil { + return nil, err + } + m := []VolResponse{} + _, err = vols.client.Do(req, &m) + if err != nil { + return nil, err + } + return m, nil +} diff --git a/drivers/pure/flashblade/fb.go b/drivers/pure/flashblade/fb.go index ed7a5ed83..fee7dd91d 100644 --- a/drivers/pure/flashblade/fb.go +++ b/drivers/pure/flashblade/fb.go @@ -16,7 +16,7 @@ import ( ) // supportedRestVersions is used to negotiate the API version to use -var supportedRestVersions = [...]string{"1.0", "1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7", "1.8", "1.8.1", "1.9", "1.10", "1.11", "1.12", "2.0", "2.1", "2.2", "2.3", "2.4"} +var supportedRestVersions = [...]string{"2.0", "2.1", "2.2", "2.3", "2.4"} type Client struct { MgmtIp string diff --git a/drivers/scheduler/anthos/anthos.go b/drivers/scheduler/anthos/anthos.go index 5eab158c0..86976f190 100644 --- a/drivers/scheduler/anthos/anthos.go +++ b/drivers/scheduler/anthos/anthos.go @@ -1,9 +1,9 @@ package anthos import ( + "context" "encoding/json" "fmt" - "github.com/portworx/torpedo/pkg/errors" "io/ioutil" "os" "os/exec" @@ -14,16 +14,22 @@ import ( "strings" "time" + "github.com/portworx/torpedo/pkg/errors" + "github.com/hashicorp/go-version" - "github.com/portworx/sched-ops/k8s/core" + anthosops "github.com/portworx/sched-ops/k8s/anthos" k8s "github.com/portworx/sched-ops/k8s/core" + "github.com/portworx/sched-ops/k8s/operator" "github.com/portworx/torpedo/drivers/node" "github.com/portworx/torpedo/drivers/node/ssh" "github.com/portworx/torpedo/drivers/scheduler" kube "github.com/portworx/torpedo/drivers/scheduler/k8s" + "github.com/portworx/torpedo/drivers/volume/portworx/schedops" "github.com/portworx/torpedo/pkg/log" + gkeonprem "google.golang.org/api/gkeonprem/v1" "gopkg.in/yaml.v2" corev1 "k8s.io/api/core/v1" + "sigs.k8s.io/cluster-api/pkg/apis/deprecated/v1alpha1" ) type Gcp struct { @@ -117,6 +123,11 @@ const ( logCollectFrequencyDuration = 15 * time.Minute defaultTestConnectionTimeout = 15 * time.Minute defaultWaitUpgradeRetry = 10 * time.Second + skipReconcilePreflightFlag = "--skip-reconcile-before-preflight" + project = "portworx-eng" + location = "us-west1" + storagePDBMinAvailable = "portworx.io/storage-pdb-min-available" + clusterNameSpace = "default" ) var ( @@ -168,6 +179,7 @@ type AnthosInstance struct { type anthos struct { version string kube.K8s + Ops anthosops.Ops adminWsSSHInstance *ssh.SSH instances []AnthosInstance adminWsNode *node.Node @@ -175,6 +187,7 @@ type anthos struct { instPath string confPath string adminClusterUpgrade bool + clusterName string } // Init Initialize the driver @@ -185,6 +198,7 @@ func (anth *anthos) Init(schedOpts scheduler.InitOptions) error { if schedOpts.AnthosInstancePath == "" { return fmt.Errorf("anthos conf path is needed for anthos scheduler") } + anth.Ops = anthosops.Instance() anth.adminWsSSHInstance = &ssh.SSH{} anth.adminWsNode = &node.Node{} anth.instPath = schedOpts.AnthosInstancePath @@ -211,7 +225,10 @@ func (anth *anthos) Init(schedOpts scheduler.InitOptions) error { if len(schedOpts.UpgradeHops) > 0 && len(strings.Split(schedOpts.UpgradeHops, ",")) > 1 { anth.adminClusterUpgrade = true } - log.Infof("Skip admin cluster upgrade is: [%t]", anth.adminClusterUpgrade) + if err := anth.getUserClusterName(); err != nil { + return err + } + log.Infof("Admin cluster upgrade is: [%t]", anth.adminClusterUpgrade) return nil } @@ -312,7 +329,7 @@ func (anth *anthos) updateNodeInstance() error { log.Info("Updating node Instance") var startAdminNodeIndex int = 2 var lastAdminNodeIndex int = 4 - k8sOps, err := core.NewInstanceFromConfigFile(path.Join(anth.confPath, kubeConfig)) + k8sOps, err := k8s.NewInstanceFromConfigFile(path.Join(anth.confPath, kubeConfig)) if err != nil { return err } @@ -461,13 +478,9 @@ func (anth *anthos) upgradeUserCluster(version string) error { logChan := make(chan bool) enableControlplaneV2 := false controlPlaneEnableReg := regexp.MustCompile(`enableControlplaneV2:\s+true`) - userClusterName, err := anth.getUserClusterName() - if err != nil { - return err - } // Describe user cluster command help to identify dataplanev2 cluster cmd := fmt.Sprintf("%s --kubeconfig %s --cluster %s", - userClusterDescribeCmd, adminKubeconfPath, userClusterName) + userClusterDescribeCmd, adminKubeconfPath, anth.clusterName) log.Debugf("Executing command: %s", cmd) out, err := anth.execOnAdminWSNode(cmd) if err != nil { @@ -479,13 +492,13 @@ func (anth *anthos) upgradeUserCluster(version string) error { enableControlplaneV2 = true } - upgradeLogger := anth.startLogCollector(logChan, userClusterName, enableControlplaneV2) + upgradeLogger := anth.startLogCollector(logChan, anth.clusterName, enableControlplaneV2) cmd = fmt.Sprintf("%s%s.tgz --kubeconfig %s", upgradePrepareCmd, version, adminKubeconfPath) if out, err := anth.execOnAdminWSNode(cmd); err != nil { return fmt.Errorf("preparing user cluster for upgrade is failing: [%s]. Err: (%v)", out, err) } - cmd = fmt.Sprintf("%s --kubeconfig %s --config %s", - upgradeUserClusterCmd, adminKubeconfPath, userClusterConfPath) + cmd = fmt.Sprintf("%s --kubeconfig %s --config %s %s", + upgradeUserClusterCmd, adminKubeconfPath, userClusterConfPath, skipReconcilePreflightFlag) if out, err := anth.execOnAdminWSNode(cmd); err != nil { return fmt.Errorf("upgrading user cluster is failing: [%s]. Err: (%v)", out, err) } @@ -588,51 +601,47 @@ func (anth *anthos) unsetUserNameAndKey() error { // checkUserClusterNodesUpgradeTime measure the time taken by each node and report error func (anth *anthos) checkUserClusterNodesUpgradeTime() error { log.Info("Validating user cluster nodes upgrade time") - userCluster, err := anth.getUserClusterName() + initNodeUpgradeTime, err := anth.getStartTimeForNodePoolUpgrade(anth.clusterName) if err != nil { return err } - initNodeUpgradeTime, err := anth.getStartTimeForNodePoolUpgrade(userCluster) + log.Debugf("User cluster node pool upgrade started at: [%v]", initNodeUpgradeTime.Format(time.UnixDate)) + storagePdbVal, err := getStoragePDBMinAvailableSet() if err != nil { return err } - log.Debugf("User cluster node pool upgrade started at: [%v]", initNodeUpgradeTime.Format(time.UnixDate)) + log.Debugf("Storage PDB value is set to : [%d]", storagePdbVal) sortedNodes, err := getNodesSortByAge() if err != nil { return err } - - // As PX support one extra static IP across all node pool - // this means Anthos node upgrade will be sequential - startTime := initNodeUpgradeTime - errorMessages := make([]string, 0) - for _, node := range sortedNodes { - diff := node.CreationTimestamp.Sub(startTime) - log.Infof("[%s] node took: [%v] time to upgrade the node", node.Name, diff) - if diff > errorTimeDuration { - errorMessages = append(errorMessages, fmt.Sprintf("[%s] node upgrade took: [%v] minutes which is longer than the expected timeout value: [%v]", - node.Name, diff, errorTimeDuration)) - } - startTime = node.CreationTimestamp.Time + nPoolsMap, err := getNodePoolMap(sortedNodes) + if err != nil { + return fmt.Errorf("failed to get number of node pools for a cluster: %s. Err: %v", anth.clusterName, err) } - if len(errorMessages) > 0 { - for _, errMsg := range errorMessages { - log.Errorf(errMsg) - } - return fmt.Errorf("anthos node upgrade time exceeded the expected time") + log.Debugf("User cluster contains [%d] node pools", len(nPoolsMap)) + maxNode, err := anth.getMaxNodesUpgraded(len(sortedNodes), storagePdbVal, len(nPoolsMap)) + if err != nil { + return fmt.Errorf("failed to get max number of nodes simulataneously upgraded") } - return nil + log.Debugf("[%d] number of nodes can be upgraded at same time", maxNode) + if len(nPoolsMap) > 1 && storagePdbVal > 1 && maxNode > 1 { + log.Info("Last Anthos cluster upgrade was parallel upgrade") + return getParallelUpgradeTime(initNodeUpgradeTime, sortedNodes, maxNode) + } + + return getSequentialUpgradeTime(initNodeUpgradeTime, sortedNodes) } -// getUserClusterName return Anthos user cluster name -func (anth *anthos) getUserClusterName() (string, error) { +// getUserClusterName update Anthos cluster name +func (anth *anthos) getUserClusterName() error { log.Info("Retrieving user cluster name") var userCluster string // Listing user cluster to get user cluster name cmd := fmt.Sprintf("%s --kubeconfig %s clusters |grep -v NAME", listUserClustersCmd, adminKubeconfPath) out, err := anth.execOnAdminWSNode(cmd) if err != nil { - return "", fmt.Errorf("listing user clusters is failing: [%s]. Err: (%v)", out, err) + return fmt.Errorf("listing user clusters is failing: [%s]. Err: (%v)", out, err) } userClusters := strings.Split(out, "\n") for _, cluster := range userClusters { @@ -641,10 +650,11 @@ func (anth *anthos) getUserClusterName() (string, error) { break } if userCluster == "" { - return "", fmt.Errorf("failed to find user cluster name") + return fmt.Errorf("failed to find user cluster name") } log.Infof("Successfully retrieved user cluster name: [%s]", userCluster) - return userCluster, nil + anth.clusterName = userCluster + return nil } // getStartTimeForNodePoolUpgrade return start time when node pool upgrade started @@ -689,7 +699,7 @@ func (anth *anthos) updateFileOwnership(dirPath string) error { // dumpUpgradeLogs collects upgrade logs func (anth *anthos) dumpUpgradeLogs(clusterName string, enableControlplaneV2 bool) error { adminKubeConfPath := path.Join(anth.confPath, kubeConfig) - adminInstance, err := core.NewInstanceFromConfigFile(adminKubeConfPath) + adminInstance, err := k8s.NewInstanceFromConfigFile(adminKubeConfPath) if err != nil { return fmt.Errorf("creating admin cluster instance failing with error. Err: (%v)", err) } @@ -769,7 +779,6 @@ func (anth *anthos) startLogCollector(logChan chan bool, clusterName string, ena } }() return logTicker - } // stopLogCollector stop ticker for collecting upgrade logs @@ -779,17 +788,110 @@ func (anth *anthos) stopLogCollector(logTicker *time.Ticker, logChan chan bool) logChan <- true } -// getNodesSortByAge return sorted node list by their age +// GetNumberOfNodePool return number of nodes pools in a cluster +func (anth *anthos) GetNumberOfNodePools() (int, error) { + nodePoolList, err := anth.Ops.ListVMwareNodePools(project, location, anth.clusterName) + if err != nil { + return -1, err + } + listNodePoolResp := &gkeonprem.ListVmwareNodePoolsResponse{} + if err = json.Unmarshal(nodePoolList, listNodePoolResp); err != nil { + return -1, fmt.Errorf("fail to unmarshal list node pool response. Err: %v", err) + } + return len(listNodePoolResp.VmwareNodePools), nil +} + +// getMaxNodesUpgraded return max number of nodes can be upgraded at a time. +func (anth *anthos) getMaxNodesUpgraded(totalNodes int, storagePdbVal int, nodepoolCount int) (int, error) { + maxNodesCanBeUpgraded := 1 + // Retrieving extra static IPs for a upgrade + clusterProviderSpec, err := anth.GetProviderSpec() + if err != nil { + return -1, err + } + if clusterProviderSpec.NetworkSpec.ReservedAddresses != nil { + extraStaticIP := len(clusterProviderSpec.NetworkSpec.ReservedAddresses) - totalNodes + if extraStaticIP > maxNodesCanBeUpgraded { + maxNodesCanBeUpgraded = extraStaticIP + } + } + + // For DHCP IPs clusterProviderSpec.NetworkSpec.ReservedAddresses will be nil + if clusterProviderSpec.NetworkSpec.ReservedAddresses == nil && (nodepoolCount <= storagePdbVal || storagePdbVal == 0) { + return nodepoolCount, nil + } + + if storagePdbVal == 0 { + return minInt(maxNodesCanBeUpgraded, nodepoolCount), nil + } + + minVal := minInt(maxNodesCanBeUpgraded, storagePdbVal) + + return minInt(minVal, nodepoolCount), nil +} + +// GetVMWareCluster return VMwareCluster +func (anth *anthos) GetVMwareCluster() (*gkeonprem.VmwareCluster, error) { + vmwareClusterResp := &gkeonprem.VmwareCluster{} + vmwareCluster, err := anth.Ops.GetVMwareCluster(project, location, anth.clusterName) + if err != nil { + return vmwareClusterResp, err + } + if err = json.Unmarshal(vmwareCluster, vmwareClusterResp); err != nil { + return vmwareClusterResp, fmt.Errorf("fail to unmarshal vmware cluster response. Err: %v", err) + } + log.Debugf("Anthos VMware cluster: %v", vmwareCluster) + return vmwareClusterResp, nil +} + +// GetCluster return cluster objects +func (anth *anthos) GetCluster() (*v1alpha1.Cluster, error) { + cluster, err := anth.Ops.GetCluster(context.TODO(), anth.clusterName, clusterNameSpace) + if err != nil { + return nil, fmt.Errorf("unable to get cluster: [%s] in namespace: [%s]. Err: %v", anth.clusterName, clusterNameSpace, err) + } + return cluster, nil +} + +// GetClusterStatus return cluster status +func (anth *anthos) GetClusterStatus() (*v1alpha1.ClusterStatus, error) { + clusterStatus, err := anth.Ops.GetClusterStatus(context.TODO(), anth.clusterName, clusterNameSpace) + if err != nil { + return nil, fmt.Errorf("unable to get cluster status for cluster: [%s]. Err: %v", anth.clusterName, err) + } + log.Debugf("Anthos cluster status: %v", clusterStatus) + return clusterStatus, nil +} + +// ListCluster list anthos clusters +func (anth *anthos) ListCluster() error { + clustersList, err := anth.Ops.ListCluster(context.TODO()) + if err != nil { + return fmt.Errorf("unable to list cluster. Err: %v", err) + } + log.Debugf("List of clusters are: %v", clustersList) + return nil +} + +// GetClusterProviderSpec return providerSpec for anthos cluster +func (anth *anthos) GetProviderSpec() (*anthosops.ClusterProviderConfig, error) { + clusterProviderSpec, err := anth.Ops.GetClusterProviderSpec(context.TODO(), anth.clusterName, clusterNameSpace) + if err != nil { + return nil, err + } + log.Debugf("clusters provider spec: %v", clusterProviderSpec) + return clusterProviderSpec, nil +} + +// getNodesSortByAge return node pool map by their age func getNodesSortByAge() ([]corev1.Node, error) { nodeList, err := k8sCore.GetNodes() if err != nil { return nil, err } - sort.Slice(nodeList.Items, func(i, j int) bool { return nodeList.Items[i].CreationTimestamp.Before(&nodeList.Items[j].CreationTimestamp) }) - log.Infof("Successfully retrieved sorted nodes: [%v]", nodeList.Items) return nodeList.Items, nil } @@ -845,28 +947,127 @@ func getExecPath() (string, error) { } -func (anth *anthos) DeleteNode(node node.Node) error { - // TODO: Add implementation - return &errors.ErrNotSupported{ - Type: "Function", - Operation: "DeleteNode()", +// getStoragePDBMinAvailableSet return storage min PDB value if set else "" +func getStoragePDBMinAvailableSet() (int, error) { + pxOperator := operator.Instance() + schedOps, err := schedops.Get(SchedName) + if err != nil { + return -1, fmt.Errorf("failed to get driver for scheduler: %s. Err: %v", SchedName, err) } + pxNameSpace, err := schedOps.GetPortworxNamespace() + if err != nil { + return -1, fmt.Errorf("failed to get portworx namespace. Err: %v", err) + } + stcList, err := pxOperator.ListStorageClusters(pxNameSpace) + if err != nil { + return -1, fmt.Errorf("failed get StorageCluster list from namespace [%s], Err: %v", pxNameSpace, err) + } + + stc, err := pxOperator.GetStorageCluster(stcList.Items[0].Name, stcList.Items[0].Namespace) + if err != nil { + return -1, fmt.Errorf("failed to get StorageCluster [%s] from namespace [%s], Err: %v", stcList.Items[0].Name, stcList.Items[0].Namespace, err.Error()) + } + val, ok := stc.Annotations[storagePDBMinAvailable] + if !ok { + return 0, nil + } + pdbVal, err := strconv.Atoi(val) + if err != nil { + return -1, fmt.Errorf("failed to parse pdb value. Err: %v", err) + } + return pdbVal, nil } -func (anth *anthos) GetZones() ([]string, error) { - // TODO: Add implementation - return nil, &errors.ErrNotSupported{ - Type: "Function", - Operation: "GetZones()", +// getNodePoolMap return node pool map +func getNodePoolMap(nodeList []corev1.Node) (map[int][]corev1.Node, error) { + nodePoolMap := make(map[int][]corev1.Node) + for _, node := range nodeList { + poolVal, ok := node.Labels[labelKey] + if ok && poolVal != "" { + key, err := strconv.Atoi(strings.Split(poolVal, "-")[1]) + if err != nil { + return nodePoolMap, err + } + poolList, ok := nodePoolMap[key] + if !ok { + poolList = make([]corev1.Node, 0) + } + nodePoolMap[key] = append(poolList, node) + } + } + for _, poolNodeList := range nodePoolMap { + sort.Slice(poolNodeList, func(i, j int) bool { + return poolNodeList[i].CreationTimestamp.Before(&poolNodeList[j].CreationTimestamp) + }) } + return nodePoolMap, nil } -func (anth *anthos) GetASGClusterSize() (int64, error) { - // TODO: Add implementation - return 0, &errors.ErrNotSupported{ - Type: "Function", - Operation: "GetASGClusterSize()", +// getSequentialUpgradeTime calculate upgrade times for sequential upgrade +func getSequentialUpgradeTime(upgradeStartTime time.Time, sortedNodes []corev1.Node) error { + return printUpgradeTimeExceededErrorMessage(printNodeUpgradeTime(upgradeStartTime, sortedNodes)) +} + +// getParallelUpgradeTime calculate upgrade times for parallel upgrade +func getParallelUpgradeTime(upgradeStartTime time.Time, sortedNodes []corev1.Node, maxNode int) error { + errorMessages := make([]string, 0) + timeQueue := make([]time.Time, maxNode) + nodePoolMap, err := getNodePoolMap(sortedNodes) + if err != nil { + return fmt.Errorf("fail to retrieve node pool map. Err: %v", err) + } + log.Debugf("Retrieved node pool map: %v", nodePoolMap) + for pool := 0; pool < len(nodePoolMap); pool++ { + startTime := upgradeStartTime + // When number of pools is more than the number of nodes can be upgraded simultaneously. + // In that case upgrade will not start simultaneously in all node pools. + // Finding the new upgrade start time for node pools where upgrade will start later + if pool > maxNode { + if pool%maxNode == 0 { + sort.Slice(timeQueue, func(i, j int) bool { + return timeQueue[i].Before(timeQueue[j]) + }) + } + startTime = timeQueue[0] + timeQueue = timeQueue[1:] + } + timeQueue = append(timeQueue, nodePoolMap[pool][len(nodePoolMap[pool])-1].CreationTimestamp.Time) + errorMessages = append(errorMessages, printNodeUpgradeTime(startTime, nodePoolMap[pool])...) + } + return printUpgradeTimeExceededErrorMessage(errorMessages) +} + +// printNodeUpgradeTime print time taken by node upgrade +func printNodeUpgradeTime(startTime time.Time, sortedNodes []corev1.Node) []string { + errorMessages := make([]string, 0) + for _, node := range sortedNodes { + diff := node.CreationTimestamp.Sub(startTime) + log.Infof("[%s] node took: [%v] time to upgrade the node", node.Name, diff) + if diff > errorTimeDuration { + errorMessages = append(errorMessages, fmt.Sprintf("[%s] node upgrade took: [%v] minutes which is longer than the expected timeout value: [%v]", + node.Name, diff, errorTimeDuration)) + } + startTime = node.CreationTimestamp.Time + } + return errorMessages +} + +// printUpgradeTimeExceededErrorMessage print error messages +func printUpgradeTimeExceededErrorMessage(errorMessages []string) error { + if len(errorMessages) > 0 { + for _, errMsg := range errorMessages { + log.Errorf(errMsg) + } + return fmt.Errorf("anthos node upgrade time exceeded the expected time") + } + return nil +} + +func minInt(x int, y int) int { + if x < y { + return x } + return y } func (anth *anthos) SetASGClusterSize(perZoneCount int64, timeout time.Duration) error { diff --git a/drivers/scheduler/dcos/dcos.go b/drivers/scheduler/dcos/dcos.go index 4e896cba6..8ab686f52 100644 --- a/drivers/scheduler/dcos/dcos.go +++ b/drivers/scheduler/dcos/dcos.go @@ -974,6 +974,14 @@ func (d *dcos) CreateCsiSnapshotClass(snapClassName string, deleionPolicy string } } +func (d *dcos) CreateVolumeSnapshotClasses(snapClassName string, provisioner string, isDefault bool, deletePolicy string) (*volsnapv1.VolumeSnapshotClass, error) { + //CreateVolumeSnapshotClasses is not supported + return nil, &errors.ErrNotSupported{ + Type: "Function", + Operation: "CreateVolumeSnapshotClasses()", + } +} + func (d *dcos) CreateCsiSnapshot(name string, namespace string, class string, pvc string) (*volsnapv1.VolumeSnapshot, error) { //CreateCsiSanpshot is not supported return nil, &errors.ErrNotSupported{ @@ -998,7 +1006,7 @@ func (d *dcos) CSICloneTest(ctx *scheduler.Context, request scheduler.CSICloneRe } } -func (d *dcos) WaitForSinglePVCToBound(pvcName, namespace string) error { +func (d *dcos) WaitForSinglePVCToBound(pvcName, namespace string, timeout int) error { //WaitForSinglePVCToBound is not supported for DCOS return &errors.ErrNotSupported{ Type: "Function", diff --git a/drivers/scheduler/k8s/k8s.go b/drivers/scheduler/k8s/k8s.go index f2cb04c6b..ac8953161 100644 --- a/drivers/scheduler/k8s/k8s.go +++ b/drivers/scheduler/k8s/k8s.go @@ -883,6 +883,7 @@ func (k *K8s) parseK8SNode(n corev1.Node) node.Node { } func isCsiApp(options scheduler.ScheduleOptions, appName string) bool { + log.Debugf("checking for app [%s] in [%v] for csi enabled apps", appName, options.CsiAppKeys) for _, app := range options.CsiAppKeys { if app == appName { return true @@ -901,6 +902,7 @@ func (k *K8s) Schedule(instanceID string, options scheduler.ScheduleOptions) ([] return nil, err } if isCsiApp(options, key) { + log.Debugf("app [%s] is csi enabled", key) appSpec.IsCSI = true } apps = append(apps, appSpec) @@ -1922,8 +1924,8 @@ func (k *K8s) createStorageObject(spec interface{}, ns *corev1.Namespace, app *s if obj, ok := spec.(*storageapi.StorageClass); ok { obj.Namespace = ns.Name - if options.StorageProvisioner == "" { - if volume.GetStorageProvisioner() != PortworxStrict { + if volume.GetStorageProvisioner() != PortworxStrict { + if options.StorageProvisioner == string(volume.DefaultStorageProvisioner) || options.StorageProvisioner == CsiProvisioner { if app.IsCSI { obj.Provisioner = CsiProvisioner } else { @@ -2218,44 +2220,57 @@ func (k *K8s) addSecurityAnnotation(spec interface{}, configMap *corev1.ConfigMa encryptionFlag = true } + setSecureParams := func(obj *storageapi.StorageClass) { + if encryptionFlag { + log.Infof("Adding encryption parameter to storage class app %s", app.Key) + obj.Parameters[encryptionName] = "true" + } + if app.IsCSI { + obj.Parameters[CsiProvisionerSecretName] = configMap.Data[secretNameKey] + obj.Parameters[CsiProvisionerSecretNamespace] = configMap.Data[secretNamespaceKey] + obj.Parameters[CsiNodePublishSecretName] = configMap.Data[secretNameKey] + obj.Parameters[CsiNodePublishSecretNamespace] = configMap.Data[secretNamespaceKey] + obj.Parameters[CsiControllerExpandSecretName] = configMap.Data[secretNameKey] + obj.Parameters[CsiControllerExpandSecretNamespace] = configMap.Data[secretNamespaceKey] + } + if strings.Contains(volume.GetStorageProvisioner(), "pxd") { + if secretNameKeyFlag { + obj.Parameters[CsiProvisionerSecretName] = configMap.Data[secretNameKey] + obj.Parameters[CsiNodePublishSecretName] = configMap.Data[secretNameKey] + obj.Parameters[CsiControllerExpandSecretName] = configMap.Data[secretNameKey] + } + if secretNamespaceKeyFlag { + obj.Parameters[CsiProvisionerSecretNamespace] = configMap.Data[secretNamespaceKey] + obj.Parameters[CsiNodePublishSecretNamespace] = configMap.Data[secretNamespaceKey] + obj.Parameters[CsiControllerExpandSecretNamespace] = configMap.Data[secretNamespaceKey] + } + } else { + if secretNameKeyFlag { + obj.Parameters[secretName] = configMap.Data[secretNameKey] + } + if secretNamespaceKeyFlag { + obj.Parameters[secretNamespace] = configMap.Data[secretNamespaceKey] + } + } + } + if obj, ok := spec.(*storageapi.StorageClass); ok { - //secure-apps list is provided for which volumes should be encrypted - if len(k.secureApps) > 0 || k.secretConfigMapName != "" { - if k.isSecureEnabled(app.Key, k.secureApps) || k.secretConfigMapName != "" { - if obj.Parameters == nil { - obj.Parameters = make(map[string]string) - } - if encryptionFlag { - log.Infof("Adding encryption parameter to storage class app %s", app.Key) - obj.Parameters[encryptionName] = "true" - } - if app.IsCSI { - obj.Parameters[CsiProvisionerSecretName] = configMap.Data[secretNameKey] - obj.Parameters[CsiProvisionerSecretNamespace] = configMap.Data[secretNamespaceKey] - obj.Parameters[CsiNodePublishSecretName] = configMap.Data[secretNameKey] - obj.Parameters[CsiNodePublishSecretNamespace] = configMap.Data[secretNamespaceKey] - } - if strings.Contains(volume.GetStorageProvisioner(), "pxd") { - if secretNameKeyFlag { - obj.Parameters[CsiProvisionerSecretName] = configMap.Data[secretNameKey] - obj.Parameters[CsiNodePublishSecretName] = configMap.Data[secretNameKey] - obj.Parameters[CsiControllerExpandSecretName] = configMap.Data[secretNameKey] - } - if secretNamespaceKeyFlag { - obj.Parameters[CsiProvisionerSecretNamespace] = configMap.Data[secretNamespaceKey] - obj.Parameters[CsiNodePublishSecretNamespace] = configMap.Data[secretNamespaceKey] - obj.Parameters[CsiControllerExpandSecretNamespace] = configMap.Data[secretNamespaceKey] - } - } else { - if secretNameKeyFlag { - obj.Parameters[secretName] = configMap.Data[secretNameKey] - } - if secretNamespaceKeyFlag { - obj.Parameters[secretNamespace] = configMap.Data[secretNamespaceKey] - } - } + + if k.secretConfigMapName != "" { + if obj.Parameters == nil { + obj.Parameters = make(map[string]string) + } + + //if secure-apps list is provided, check if the app is in the list and set the secure parameters for only that app + if len(k.secureApps) > 0 && k.isSecureEnabled(app.Key, k.secureApps) { + setSecureParams(obj) + } + //if secure-apps list is not provided, set the secure parameters for all apps if secret config map is provided + if len(k.secureApps) == 0 { + setSecureParams(obj) } } + } else if obj, ok := spec.(*corev1.PersistentVolumeClaim); ok { if obj.Annotations == nil { @@ -7519,7 +7534,7 @@ func (k *K8s) snapshotAndVerify(size resource.Quantity, data, snapName, namespac } // Wait for PVC to be bound - err = k.WaitForSinglePVCToBound(restoredPVCName, restoredPVC.Namespace) + err = k.WaitForSinglePVCToBound(restoredPVCName, restoredPVC.Namespace, 0) if err != nil { return fmt.Errorf("failed to wait for cloned PVC %s to bind: %v", restoredPVCName, err) } @@ -7604,7 +7619,7 @@ func (k *K8s) cloneAndVerify(size resource.Quantity, data, namespace, storageCla } // Wait for PVC to be bound - err = k.WaitForSinglePVCToBound(clonedPVCName, clonedPVC.Namespace) + err = k.WaitForSinglePVCToBound(clonedPVCName, clonedPVC.Namespace, 0) if err != nil { return fmt.Errorf("failed to wait for cloned PVC %s to bind: %v", clonedPVCName, err) } @@ -8052,6 +8067,40 @@ func (k *K8s) CreateCsiSnapshotClass(snapClassName string, deleionPolicy string) return volumeSnapClass, nil } +// CreateVolumeSnapshotClasses creates a volume snapshot class +func (k *K8s) CreateVolumeSnapshotClasses(snapClassName string, provisioner string, isDefault bool, deletePolicy string) (*volsnapv1.VolumeSnapshotClass, error) { + var err error + var annotation = make(map[string]string) + var volumeSnapClass *volsnapv1.VolumeSnapshotClass + if isDefault { + annotation["snapshot.storage.kubernetes.io/is-default-class"] = "true" + } else { + annotation = make(map[string]string) + } + + v1obj := metav1.ObjectMeta{ + Name: snapClassName, + Annotations: annotation, + } + if len(deletePolicy) == 0 { + deletePolicy = "Delete" + } + snapClass := volsnapv1.VolumeSnapshotClass{ + ObjectMeta: v1obj, + Driver: provisioner, + DeletionPolicy: volsnapv1.DeletionPolicy(deletePolicy), + } + + log.Infof("Creating volume snapshot class: %v with provisioner %v", snapClassName, provisioner) + if volumeSnapClass, err = k8sExternalsnap.CreateSnapshotClass(&snapClass); err != nil { + return nil, &scheduler.ErrFailedToCreateSnapshotClass{ + Name: snapClassName, + Cause: err, + } + } + return volumeSnapClass, nil +} + // waitForCsiSnapToBeReady wait for snapshot status to be ready func (k *K8s) waitForCsiSnapToBeReady(snapName string, namespace string) error { var snap *volsnapv1.VolumeSnapshot @@ -8103,10 +8152,15 @@ func (k *K8s) waitForPodToBeReady(podname string, namespace string) error { } // WaitForSinglePVCToBound retries and waits up to 30 minutes for a single PVC to be bound -func (k *K8s) WaitForSinglePVCToBound(pvcName, namespace string) error { +func (k *K8s) WaitForSinglePVCToBound(pvcName, namespace string, timeout int) error { var pvc *v1.PersistentVolumeClaim var err error kubeClient, err := k.getKubeClient("") + var timeLimit int + timeLimit = 30 + if timeout != 0 && timeout < 60 { + timeLimit = timeout + } if err != nil { log.Error("Failed to get Kube client") return err @@ -8121,7 +8175,7 @@ func (k *K8s) WaitForSinglePVCToBound(pvcName, namespace string) error { } return "", false, nil } - if _, err := task.DoRetryWithTimeout(t, 30*time.Minute, 30*time.Second); err != nil { + if _, err := task.DoRetryWithTimeout(t, time.Duration(timeLimit)*time.Minute, 30*time.Second); err != nil { return err } log.Infof("PVC is in bound: %s", pvc.Name) diff --git a/drivers/scheduler/k8s/specs/aggr-mysql/px-mysql-app.yaml b/drivers/scheduler/k8s/specs/aggr-mysql/px-mysql-app.yaml index 5ce19b6af..7f7dcb642 100644 --- a/drivers/scheduler/k8s/specs/aggr-mysql/px-mysql-app.yaml +++ b/drivers/scheduler/k8s/specs/aggr-mysql/px-mysql-app.yaml @@ -88,7 +88,7 @@ spec: spec: containers: - name: mysqlslap - image: adityadani/mysqlslap + image: portworx/mysqlslap imagePullPolicy: IfNotPresent env: - name: MYSQL_ROOT_PASSWORD diff --git a/drivers/scheduler/k8s/specs/bonnie-sharedv4/px-bonnie-app.yml b/drivers/scheduler/k8s/specs/bonnie-sharedv4/px-bonnie-app.yml index 9179aa49d..cbdf74e9e 100644 --- a/drivers/scheduler/k8s/specs/bonnie-sharedv4/px-bonnie-app.yml +++ b/drivers/scheduler/k8s/specs/bonnie-sharedv4/px-bonnie-app.yml @@ -21,8 +21,8 @@ spec: runAsUser: 0 resources: limits: - memory: 1Gi - cpu: 100m + memory: 3Gi + cpu: 2 {{ if .CustomCommand }} command: {{ .CustomCommand | array }} {{ else }} diff --git a/drivers/scheduler/k8s/specs/bonnie-sv4-svc/px-bonnie-app.yml b/drivers/scheduler/k8s/specs/bonnie-sv4-svc/px-bonnie-app.yml index 9da1817e7..31e9466e2 100644 --- a/drivers/scheduler/k8s/specs/bonnie-sv4-svc/px-bonnie-app.yml +++ b/drivers/scheduler/k8s/specs/bonnie-sv4-svc/px-bonnie-app.yml @@ -19,8 +19,8 @@ spec: imagePullPolicy: IfNotPresent resources: limits: - memory: 1Gi - cpu: 100m + memory: 3Gi + cpu: 2 {{ if .CustomCommand }} command: {{ .CustomCommand | array }} {{ else }} diff --git a/drivers/scheduler/k8s/specs/fio-fbda-ep/fio-config-map.yaml b/drivers/scheduler/k8s/specs/fio-fbda-ep/fio-config-map.yaml new file mode 100644 index 000000000..f6e337fcd --- /dev/null +++ b/drivers/scheduler/k8s/specs/fio-fbda-ep/fio-config-map.yaml @@ -0,0 +1,86 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: fio-job-config +data: + fio.job: | + [global] + name=fio-rand-RW + directory=/scratch/ + rw=randwrite + rwmixread=75 + randrepeat=1 + blocksize_range=4k-512k + direct=1 + end_fsync=1 + do_verify=1 + verify=crc32c + verify_pattern=0xdeadbeef + disable_lat=0 + time_based=1 + runtime=99999999 + [file1] + filesize=1M-10M + nrfiles=10000 + ioengine=libaio + iodepth=128 +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: grok-exporter +data: + config.yml: |- + global: + config_version: 3 + input: + type: file + path: /logs/fio.log + readall: false + fail_on_missing_logfile: true + imports: + - type: grok_patterns + dir: ./patterns + grok_patterns: + - 'FIO_IOPS [0-9]*[.][0-9]k$|[0-9]*' + metrics: + - type: gauge + name: iops + help: FIO IOPS Write Gauge Metrics + match: ' write: %{GREEDYDATA}, iops=%{NUMBER:val1}%{GREEDYDATA:thsd}, %{GREEDYDATA}' + value: '{{`{{if eq .thsd "k"}}{{multiply .val1 1000}}{{else}}{{.val1}}{{end}}`}}' + labels: + iops_suffix: '{{`{{.thsd}}`}}' + cumulative: false + retention: 1s + - type: gauge + name: bandwidth + help: FIO Bandwidth Write Gauge Metrics + match: ' write: io=%{GREEDYDATA}, bw=%{NUMBER:val2}%{GREEDYDATA:kbs}, %{GREEDYDATA}, %{GREEDYDATA}' + value: '{{`{{if eq .kbs "KB/s"}}{{divide .val2 1024}}{{else}}{{.val2}}{{end}}`}}' + labels: + bw_unit: '{{`{{.kbs}}`}}' + cumulative: false + retention: 1s + - type: gauge + name: avg_latency + help: FIO AVG Latency Write Gauge Metrics + match: ' lat (%{GREEDYDATA:nsec}): min=%{GREEDYDATA}, max=%{GREEDYDATA}, avg=%{NUMBER:val3}, stdev=%{GREEDYDATA}' + value: '{{`{{if eq .nsec "(usec)"}}{{divide .val3 1000}}{{else}}{{.val3}}{{end}}`}}' + labels: + lat_unit: '{{`{{.nsec}}`}}' + cumulative: false + retention: 1s +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: fio-ready-probe +data: + ready-probe.sh: | + #!/bin/bash + if [ `cat /root/fio.log | grep 'error\|bad magic header' | wc -l` -ge 1 ]; then + exit 1; + else + exit 0; + fi diff --git a/drivers/scheduler/k8s/specs/fio-fbda-ep/fio.yaml b/drivers/scheduler/k8s/specs/fio-fbda-ep/fio.yaml new file mode 100644 index 000000000..d136e0532 --- /dev/null +++ b/drivers/scheduler/k8s/specs/fio-fbda-ep/fio.yaml @@ -0,0 +1,94 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: fio +spec: + serviceName: fio + {{ if .Replicas }} + replicas: {{ .Replicas }} + {{ else }} + replicas: 6{{ end }} + selector: + matchLabels: + app: fio + template: + metadata: + labels: + app: fio + spec: + schedulerName: stork + containers: + - name: fio + image: portworx/fio_drv + command: ["fio"] + resources: + limits: + cpu: "2" + memory: 4Gi + requests: + cpu: "1" + memory: 4Gi + args: ["/configs/fio.job", "--status-interval=1", "--eta=never", "--output=/logs/fio.log"] + volumeMounts: + - name: fio-config-vol + mountPath: /configs + - name: fio-data + mountPath: /scratch + - name: fio-log + mountPath: /logs + - name: grok + image: pwxvin/grok-exporter:v1.0.0-RC4 + imagePullPolicy: IfNotPresent + ports: + - name: grok-port + containerPort: 9144 + protocol: TCP + volumeMounts: + - name: grok-config-volume + mountPath: /etc/grok_exporter + - name: fio-log + mountPath: /logs + volumes: + - name: fio-config-vol + configMap: + name: fio-job-config + - name: grok-config-volume + configMap: + name: grok-exporter + volumeClaimTemplates: + - metadata: + name: fio-data + spec: + storageClassName: fio-fb-sc-ep + accessModes: + - ReadWriteOnce + resources: + requests: + {{ if .VolumeSize }} + storage: {{ .VolumeSize }} + {{ else }} + storage: 200Gi{{ end }} + - metadata: + name: fio-log + spec: + storageClassName: fio-log-fb-sc-ep + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 50Gi +--- +apiVersion: v1 +kind: Service +metadata: + name: grok-exporter-svc + labels: + app: fio +spec: + clusterIP: None + selector: + app: fio + ports: + - name: grok-port + port: 9144 + targetPort: 9144 \ No newline at end of file diff --git a/drivers/scheduler/k8s/specs/fio-fbda-ep/px-storage-class.yaml b/drivers/scheduler/k8s/specs/fio-fbda-ep/px-storage-class.yaml new file mode 100644 index 000000000..2d66fb936 --- /dev/null +++ b/drivers/scheduler/k8s/specs/fio-fbda-ep/px-storage-class.yaml @@ -0,0 +1,35 @@ +##### FB direct access storage class +kind: StorageClass +apiVersion: storage.k8s.io/v1 +metadata: + name: fio-fb-sc-ep +provisioner: pxd.portworx.com +parameters: + backend: "pure_file" + pure_export_rules: "*(rw)" + {{ if .StorageClassPureNfsEndpoint }} + pure_nfs_endpoint: "{{ .StorageClassPureNfsEndpoint }}" + {{ end }} +mountOptions: + - nfsvers=4.1 + - tcp +volumeBindingMode: WaitForFirstConsumer +allowVolumeExpansion: true +--- +##### FB direct access storage class +kind: StorageClass +apiVersion: storage.k8s.io/v1 +metadata: + name: fio-log-fb-sc-ep +provisioner: pxd.portworx.com +parameters: + backend: "pure_file" + pure_export_rules: "*(rw)" + {{ if .StorageClassPureNfsEndpoint }} + pure_nfs_endpoint: "{{ .StorageClassPureNfsEndpoint }}" + {{ end }} +mountOptions: + - nfsvers=4.1 + - tcp +volumeBindingMode: WaitForFirstConsumer +allowVolumeExpansion: true \ No newline at end of file diff --git a/drivers/scheduler/k8s/specs/kubevirt-debian-fio-low-ha/vm.yaml b/drivers/scheduler/k8s/specs/kubevirt-debian-fio-low-ha/vm.yaml index 9cd24942a..f6dd555f8 100644 --- a/drivers/scheduler/k8s/specs/kubevirt-debian-fio-low-ha/vm.yaml +++ b/drivers/scheduler/k8s/specs/kubevirt-debian-fio-low-ha/vm.yaml @@ -25,6 +25,15 @@ spec: disk: bus: virtio name: rootdisk + - name: fio-data-disk-1 + disk: + bus: virtio + - name: fio-data-disk-2 + disk: + bus: virtio + - name: fio-data-disk-3 + disk: + bus: virtio interfaces: - name: default masquerade: {} diff --git a/drivers/scheduler/k8s/specs/kubevirt-debian-fio-minimal/vm.yaml b/drivers/scheduler/k8s/specs/kubevirt-debian-fio-minimal/vm.yaml index f65d9bcfa..6377a3eda 100644 --- a/drivers/scheduler/k8s/specs/kubevirt-debian-fio-minimal/vm.yaml +++ b/drivers/scheduler/k8s/specs/kubevirt-debian-fio-minimal/vm.yaml @@ -25,6 +25,15 @@ spec: disk: bus: virtio name: rootdisk + - name: fio-data-disk-1 + disk: + bus: virtio + - name: fio-data-disk-2 + disk: + bus: virtio + - name: fio-data-disk-3 + disk: + bus: virtio interfaces: - name: default masquerade: {} diff --git a/drivers/scheduler/k8s/specs/kubevirt-fio-datavoltemplate/boot-disk-template.yaml b/drivers/scheduler/k8s/specs/kubevirt-fio-datavoltemplate/boot-disk-template.yaml new file mode 100644 index 000000000..4ca461542 --- /dev/null +++ b/drivers/scheduler/k8s/specs/kubevirt-fio-datavoltemplate/boot-disk-template.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: root-disk-template-pvc-ea-build + namespace: openshift-virtualization-os-images + labels: + app: containerized-data-importer + annotations: + cdi.kubevirt.io/storage.import.endpoint: http://kubevirt-disk-registry.pwx.dev.purestorage.com/more_images/fio-multi-disk.qcow2 + pvc.source: "cloned" +spec: + storageClassName: sv4-repl2-multi-disk + accessModes: + - ReadWriteMany + resources: + requests: + storage: 200Gi diff --git a/drivers/scheduler/k8s/specs/kubevirt-fio-datavoltemplate/data-disk-template.yaml b/drivers/scheduler/k8s/specs/kubevirt-fio-datavoltemplate/data-disk-template.yaml new file mode 100644 index 000000000..0b2ce2068 --- /dev/null +++ b/drivers/scheduler/k8s/specs/kubevirt-fio-datavoltemplate/data-disk-template.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: fio-disk-template + namespace: openshift-virtualization-os-images + annotations: + pvc.source: "cloned" +spec: + storageClassName: sv4-repl2-multi-disk + accessModes: + - ReadWriteMany + resources: + requests: + storage: 50Gi diff --git a/drivers/scheduler/k8s/specs/kubevirt-fio-datavoltemplate/pxd/sc-wffc.yaml b/drivers/scheduler/k8s/specs/kubevirt-fio-datavoltemplate/pxd/sc-wffc.yaml new file mode 100644 index 000000000..fa8c78f76 --- /dev/null +++ b/drivers/scheduler/k8s/specs/kubevirt-fio-datavoltemplate/pxd/sc-wffc.yaml @@ -0,0 +1,11 @@ +kind: StorageClass +apiVersion: storage.k8s.io/v1 +metadata: + name: test-multi-disk-wffc +provisioner: pxd.portworx.com +parameters: + repl: "2" + sharedv4_mount_options: vers=3.0,nolock + io_profile: db_remote +allowVolumeExpansion: true +volumeBindingMode: WaitForFirstConsumer diff --git a/drivers/scheduler/k8s/specs/kubevirt-fio-datavoltemplate/pxd/sc.yaml b/drivers/scheduler/k8s/specs/kubevirt-fio-datavoltemplate/pxd/sc.yaml new file mode 100644 index 000000000..4c1eec484 --- /dev/null +++ b/drivers/scheduler/k8s/specs/kubevirt-fio-datavoltemplate/pxd/sc.yaml @@ -0,0 +1,11 @@ +kind: StorageClass +apiVersion: storage.k8s.io/v1 +metadata: + name: sv4-repl2-multi-disk +provisioner: pxd.portworx.com +parameters: + repl: "2" + sharedv4_mount_options: vers=3.0,nolock + io_profile: db_remote +allowVolumeExpansion: true +volumeBindingMode: Immediate diff --git a/drivers/scheduler/k8s/specs/kubevirt-fio-datavoltemplate/vm-datavol.yaml b/drivers/scheduler/k8s/specs/kubevirt-fio-datavoltemplate/vm-datavol.yaml new file mode 100644 index 000000000..59a26390b --- /dev/null +++ b/drivers/scheduler/k8s/specs/kubevirt-fio-datavoltemplate/vm-datavol.yaml @@ -0,0 +1,235 @@ +apiVersion: kubevirt.io/v1 +kind: VirtualMachine +metadata: + name: fio-vm-multi-disk +spec: + running: true + template: + metadata: + labels: + kubevirt.io/domain: ubuntu-bionic + kubevirt-key: kubevirt-val + app: vm-multi-disk + pvc.source: "cloned" + spec: + domain: + cpu: + cores: 4 + devices: + disks: + - name: containervolume + disk: + bus: virtio + - name: datavolume1 + disk: + bus: virtio + - name: datavolume2 + disk: + bus: virtio + - name: datavolume3 + disk: + bus: virtio + - name: datavolume4 + disk: + bus: virtio + - name: datavolume5 + disk: + bus: virtio + - name: datavolume6 + disk: + bus: virtio + - name: datavolume7 + disk: + bus: virtio + - name: datavolume8 + disk: + bus: virtio + - name: cloudinitvolume + disk: + bus: virtio + interfaces: + - name: default + masquerade: {} + resources: + requests: + cpu: 6 + memory: 8192M + networks: + - name: default + pod: {} + volumes: + - name: containervolume + persistentVolumeClaim: + claimName: fio-boot-pvc + - name: datavolume1 + dataVolume: + name: fio-disk-1 + - name: datavolume2 + dataVolume: + name: fio-disk-2 + - name: datavolume3 + dataVolume: + name: fio-disk-3 + - name: datavolume4 + dataVolume: + name: fio-disk-4 + - name: datavolume5 + dataVolume: + name: fio-disk-5 + - name: datavolume6 + dataVolume: + name: fio-disk-6 + - name: datavolume7 + dataVolume: + name: fio-disk-7 + - name: datavolume8 + dataVolume: + name: fio-disk-8 + - name: cloudinitvolume + cloudInitNoCloud: + userData: |- + #cloud-config + chpasswd: + list: | + ubuntu:ubuntu + root:toor + expire: False + runcmd: + - while true; do + sleep 60 + done + dataVolumeTemplates: + - metadata: + name: fio-boot-pvc + spec: + source: + pvc: + name: root-disk-template-pvc-ea-build + namespace: openshift-virtualization-os-images + pvc: + accessModes: + - ReadWriteMany + resources: + requests: + storage: 200Gi + storageClassName: test-multi-disk-wffc + volumeMode: Filesystem + - metadata: + name: fio-disk-1 + spec: + source: + pvc: + name: fio-disk-template + namespace: openshift-virtualization-os-images + pvc: + accessModes: + - ReadWriteMany + resources: + requests: + storage: 100Gi + storageClassName: test-multi-disk-wffc + volumeMode: Filesystem + - metadata: + name: fio-disk-2 + spec: + source: + pvc: + name: fio-disk-template + namespace: openshift-virtualization-os-images + pvc: + accessModes: + - ReadWriteMany + resources: + requests: + storage: 100Gi + storageClassName: test-multi-disk-wffc + - metadata: + name: fio-disk-3 + spec: + source: + pvc: + name: fio-disk-template + namespace: openshift-virtualization-os-images + pvc: + accessModes: + - ReadWriteMany + resources: + requests: + storage: 100Gi + storageClassName: test-multi-disk-wffc + volumeMode: Filesystem + - metadata: + name: fio-disk-4 + spec: + source: + pvc: + name: fio-disk-template + namespace: openshift-virtualization-os-images + pvc: + accessModes: + - ReadWriteMany + resources: + requests: + storage: 100Gi + storageClassName: test-multi-disk-wffc + volumeMode: Filesystem + - metadata: + name: fio-disk-5 + spec: + source: + pvc: + name: fio-disk-template + namespace: openshift-virtualization-os-images + pvc: + accessModes: + - ReadWriteMany + resources: + requests: + storage: 100Gi + storageClassName: test-multi-disk-wffc + volumeMode: Filesystem + - metadata: + name: fio-disk-6 + spec: + source: + pvc: + name: fio-disk-template + namespace: openshift-virtualization-os-images + pvc: + accessModes: + - ReadWriteMany + resources: + requests: + storage: 100Gi + storageClassName: test-multi-disk-wffc + volumeMode: Filesystem + - metadata: + name: fio-disk-7 + spec: + source: + pvc: + name: fio-disk-template + namespace: openshift-virtualization-os-images + pvc: + accessModes: + - ReadWriteMany + resources: + requests: + storage: 100Gi + storageClassName: test-multi-disk-wffc + volumeMode: Filesystem + - metadata: + name: fio-disk-8 + spec: + source: + pvc: + name: fio-disk-template + namespace: openshift-virtualization-os-images + pvc: + accessModes: + - ReadWriteMany + resources: + requests: + storage: 100Gi + storageClassName: test-multi-disk-wffc + volumeMode: Filesystem diff --git a/drivers/scheduler/k8s/specs/kubevirt-forklift-fio-largedisk/fio-boot-pvc.yaml b/drivers/scheduler/k8s/specs/kubevirt-forklift-fio-largedisk/fio-boot-pvc.yaml new file mode 100644 index 000000000..61bc14b9f --- /dev/null +++ b/drivers/scheduler/k8s/specs/kubevirt-forklift-fio-largedisk/fio-boot-pvc.yaml @@ -0,0 +1,20 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: fio-boot-pvc + labels: + app: containerized-data-importer + annotations: + "cdi.kubevirt.io/storage.import.endpoint": "http://kubevirt-disk-registry.pwx.dev.purestorage.com/more_images/fio-multi-disk.qcow2" + "cdi.kubevirt.io/storage.contentType": "kubevirt" + forklift.konveyor.io/disk-source: "[VCD-DEV-LINUX2-PURE-002] satdaap00886/satdaap00886_1.vmdk" + "vmID": {{ .VmID }} + cdi.kubevirt.io/storage.bind.immediate.requested: "true" + pvc.source: "cloned" +spec: + storageClassName: sv4-wffc-localattach-multi-disk + accessModes: + - ReadWriteMany + resources: + requests: + storage: 50Gi diff --git a/drivers/scheduler/k8s/specs/kubevirt-forklift-fio-largedisk/pxd/sc.yaml b/drivers/scheduler/k8s/specs/kubevirt-forklift-fio-largedisk/pxd/sc.yaml new file mode 100644 index 000000000..45e8e6cd2 --- /dev/null +++ b/drivers/scheduler/k8s/specs/kubevirt-forklift-fio-largedisk/pxd/sc.yaml @@ -0,0 +1,12 @@ +kind: StorageClass +apiVersion: storage.k8s.io/v1 +metadata: + name: sv4-wffc-localattach-multi-disk +provisioner: pxd.portworx.com +parameters: + repl: "2" + sharedv4_mount_options: "vers=3.0,nolock" + io_profile: "db_remote" +allowVolumeExpansion: true +reclaimPolicy: Delete +volumeBindingMode: WaitForFirstConsumer diff --git a/drivers/scheduler/k8s/specs/kubevirt-forklift-fio-largedisk/vm.yaml b/drivers/scheduler/k8s/specs/kubevirt-forklift-fio-largedisk/vm.yaml new file mode 100644 index 000000000..6e3f424c0 --- /dev/null +++ b/drivers/scheduler/k8s/specs/kubevirt-forklift-fio-largedisk/vm.yaml @@ -0,0 +1,236 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: fio-disk-1 + annotations: + "cdi.kubevirt.io/storage.contentType": "kubevirt" + "forklift.konveyor.io/disk-source": "[VCD-DEV-LINUX2-PURE-002] satdaap00886/satdaap00886_1.vmdk" + "vmID": {{ .VmID }} +spec: + storageClassName: sv4-wffc-localattach-multi-disk + accessModes: + - ReadWriteMany + resources: + requests: + storage: 2048Gi + +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: fio-disk-2 + annotations: + "cdi.kubevirt.io/storage.contentType": "kubevirt" + "forklift.konveyor.io/disk-source": "[VCD-DEV-LINUX2-PURE-002] satdaap00886/satdaap00886_1.vmdk" + "vmID": {{ .VmID }} +spec: + storageClassName: sv4-wffc-localattach-multi-disk + accessModes: + - ReadWriteMany + resources: + requests: + storage: 120Gi + +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: fio-disk-3 + annotations: + "cdi.kubevirt.io/storage.contentType": "kubevirt" + "forklift.konveyor.io/disk-source": "[VCD-DEV-LINUX2-PURE-002] satdaap00886/satdaap00886_1.vmdk" + "vmID": {{ .VmID }} +spec: + storageClassName: sv4-wffc-localattach-multi-disk + accessModes: + - ReadWriteMany + resources: + requests: + storage: 20Gi + +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: fio-disk-4 + annotations: + "cdi.kubevirt.io/storage.contentType": "kubevirt" + "forklift.konveyor.io/disk-source": "[VCD-DEV-LINUX2-PURE-002] satdaap00886/satdaap00886_1.vmdk" + "vmID": {{ .VmID }} +spec: + storageClassName: sv4-wffc-localattach-multi-disk + accessModes: + - ReadWriteMany + resources: + requests: + storage: 20Gi + +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: fio-disk-5 + annotations: + "cdi.kubevirt.io/storage.contentType": "kubevirt" + "forklift.konveyor.io/disk-source": "[VCD-DEV-LINUX2-PURE-002] satdaap00886/satdaap00886_1.vmdk" + "vmID": {{ .VmID }} +spec: + storageClassName: sv4-wffc-localattach-multi-disk + accessModes: + - ReadWriteMany + resources: + requests: + storage: 20Gi + +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: fio-disk-6 + annotations: + "cdi.kubevirt.io/storage.contentType": "kubevirt" + "forklift.konveyor.io/disk-source": "[VCD-DEV-LINUX2-PURE-002] satdaap00886/satdaap00886_1.vmdk" + "vmID": {{ .VmID }} +spec: + storageClassName: sv4-wffc-localattach-multi-disk + accessModes: + - ReadWriteMany + resources: + requests: + storage: 20Gi + +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: fio-disk-7 + annotations: + "cdi.kubevirt.io/storage.contentType": "kubevirt" + "forklift.konveyor.io/disk-source": "[VCD-DEV-LINUX2-PURE-002] satdaap00886/satdaap00886_1.vmdk" + "vmID": {{ .VmID }} +spec: + storageClassName: sv4-wffc-localattach-multi-disk + accessModes: + - ReadWriteMany + resources: + requests: + storage: 20Gi + +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: fio-disk-8 + annotations: + "cdi.kubevirt.io/storage.contentType": "kubevirt" + "forklift.konveyor.io/disk-source": "[VCD-DEV-LINUX2-PURE-002] satdaap00886/satdaap00886_1.vmdk" + "vmID": {{ .VmID }} +spec: + storageClassName: sv4-wffc-localattach-multi-disk + accessModes: + - ReadWriteMany + resources: + requests: + storage: 20Gi + +--- +apiVersion: kubevirt.io/v1 +kind: VirtualMachine +metadata: + name: fio-vm-multi-disk +spec: + running: true + template: + metadata: + labels: + kubevirt.io/domain: ubuntu-bionic + kubevirt-key: kubevirt-val + app: vm-multi-disk + "vmID": {{ .VmID }} + spec: + domain: + cpu: + cores: 4 + devices: + disks: + - name: containervolume + disk: + bus: virtio + - name: datavolume1 + disk: + bus: virtio + - name: datavolume2 + disk: + bus: virtio + - name: datavolume3 + disk: + bus: virtio + - name: datavolume4 + disk: + bus: virtio + - name: datavolume5 + disk: + bus: virtio + - name: datavolume6 + disk: + bus: virtio + - name: datavolume7 + disk: + bus: virtio + - name: datavolume8 + disk: + bus: virtio + - name: cloudinitvolume + disk: + bus: virtio + interfaces: + - name: default + masquerade: {} + resources: + requests: + cpu: 6 + memory: 8192M + networks: + - name: default + pod: {} + volumes: + - name: containervolume + persistentVolumeClaim: + claimName: fio-boot-pvc + - name: datavolume1 + dataVolume: + name: fio-disk-1 + - name: datavolume2 + dataVolume: + name: fio-disk-2 + - name: datavolume3 + dataVolume: + name: fio-disk-3 + - name: datavolume4 + dataVolume: + name: fio-disk-4 + - name: datavolume5 + dataVolume: + name: fio-disk-5 + - name: datavolume6 + dataVolume: + name: fio-disk-6 + - name: datavolume7 + dataVolume: + name: fio-disk-7 + - name: datavolume8 + dataVolume: + name: fio-disk-8 + - name: cloudinitvolume + cloudInitNoCloud: + userData: |- + #cloud-config + chpasswd: + list: | + ubuntu:ubuntu + root:toor + expire: False + runcmd: + - while true; do + sleep 60 + done diff --git a/drivers/scheduler/k8s/specs/kubevirt-win22-forklift/pxd/sc.yaml b/drivers/scheduler/k8s/specs/kubevirt-win22-forklift/pxd/sc.yaml new file mode 100644 index 000000000..45e8e6cd2 --- /dev/null +++ b/drivers/scheduler/k8s/specs/kubevirt-win22-forklift/pxd/sc.yaml @@ -0,0 +1,12 @@ +kind: StorageClass +apiVersion: storage.k8s.io/v1 +metadata: + name: sv4-wffc-localattach-multi-disk +provisioner: pxd.portworx.com +parameters: + repl: "2" + sharedv4_mount_options: "vers=3.0,nolock" + io_profile: "db_remote" +allowVolumeExpansion: true +reclaimPolicy: Delete +volumeBindingMode: WaitForFirstConsumer diff --git a/drivers/scheduler/k8s/specs/kubevirt-win22-forklift/vm-template.yaml b/drivers/scheduler/k8s/specs/kubevirt-win22-forklift/vm-template.yaml new file mode 100644 index 000000000..fd13afbd3 --- /dev/null +++ b/drivers/scheduler/k8s/specs/kubevirt-win22-forklift/vm-template.yaml @@ -0,0 +1,221 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: win-disk-1 + annotations: + "cdi.kubevirt.io/storage.contentType": "kubevirt" + "forklift.konveyor.io/disk-source": "[VCD-DEV-LINUX2-PURE-002] satdaap00886/satdaap00886_1.vmdk" + "vmID": {{ .VmID }} +spec: + storageClassName: sv4-wffc-localattach-multi-disk + accessModes: + - ReadWriteMany + resources: + requests: + storage: 20Gi + +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: win-disk-2 + annotations: + "cdi.kubevirt.io/storage.contentType": "kubevirt" + "forklift.konveyor.io/disk-source": "[VCD-DEV-LINUX2-PURE-002] satdaap00886/satdaap00886_1.vmdk" + "vmID": {{ .VmID }} +spec: + storageClassName: sv4-wffc-localattach-multi-disk + accessModes: + - ReadWriteMany + resources: + requests: + storage: 20Gi + +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: win-disk-3 + annotations: + "cdi.kubevirt.io/storage.contentType": "kubevirt" + "forklift.konveyor.io/disk-source": "[VCD-DEV-LINUX2-PURE-002] satdaap00886/satdaap00886_1.vmdk" + "vmID": {{ .VmID }} +spec: + storageClassName: sv4-wffc-localattach-multi-disk + accessModes: + - ReadWriteMany + resources: + requests: + storage: 20Gi + +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: win-disk-4 + annotations: + "cdi.kubevirt.io/storage.contentType": "kubevirt" + "forklift.konveyor.io/disk-source": "[VCD-DEV-LINUX2-PURE-002] satdaap00886/satdaap00886_1.vmdk" + "vmID": {{ .VmID }} +spec: + storageClassName: sv4-wffc-localattach-multi-disk + accessModes: + - ReadWriteMany + resources: + requests: + storage: 20Gi + +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: win-disk-5 + annotations: + "cdi.kubevirt.io/storage.contentType": "kubevirt" + "forklift.konveyor.io/disk-source": "[VCD-DEV-LINUX2-PURE-002] satdaap00886/satdaap00886_1.vmdk" + "vmID": {{ .VmID }} +spec: + storageClassName: sv4-wffc-localattach-multi-disk + accessModes: + - ReadWriteMany + resources: + requests: + storage: 20Gi + +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: win-disk-6 + annotations: + "cdi.kubevirt.io/storage.contentType": "kubevirt" + "forklift.konveyor.io/disk-source": "[VCD-DEV-LINUX2-PURE-002] satdaap00886/satdaap00886_1.vmdk" + "vmID": {{ .VmID }} +spec: + storageClassName: sv4-wffc-localattach-multi-disk + accessModes: + - ReadWriteMany + resources: + requests: + storage: 20Gi + +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: win-disk-7 + annotations: + "cdi.kubevirt.io/storage.contentType": "kubevirt" + "forklift.konveyor.io/disk-source": "[VCD-DEV-LINUX2-PURE-002] satdaap00886/satdaap00886_1.vmdk" + "vmID": {{ .VmID }} +spec: + storageClassName: sv4-wffc-localattach-multi-disk + accessModes: + - ReadWriteMany + resources: + requests: + storage: 20Gi + +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: win-disk-8 + annotations: + "cdi.kubevirt.io/storage.contentType": "kubevirt" + "forklift.konveyor.io/disk-source": "[VCD-DEV-LINUX2-PURE-002] satdaap00886/satdaap00886_1.vmdk" + "vmID": {{ .VmID }} +spec: + storageClassName: sv4-wffc-localattach-multi-disk + accessModes: + - ReadWriteMany + resources: + requests: + storage: 20Gi + +--- + +apiVersion: kubevirt.io/v1 +kind: VirtualMachine +metadata: + name: win22-multi-disk +spec: + running: true + template: + metadata: + labels: + kubevirt.io/domain: ubuntu-bionic + app: vm-multi-disk + annotations: + pvc.source: "cloned" + spec: + domain: + cpu: + cores: 4 + devices: + disks: + - name: containervolume + disk: + bus: virtio + - name: datavolume1 + disk: + bus: virtio + - name: datavolume2 + disk: + bus: virtio + - name: datavolume3 + disk: + bus: virtio + - name: datavolume4 + disk: + bus: virtio + - name: datavolume5 + disk: + bus: virtio + - name: datavolume6 + disk: + bus: virtio + - name: datavolume7 + disk: + bus: virtio + - name: datavolume8 + disk: + bus: virtio + interfaces: + - name: default + masquerade: {} + resources: + requests: + cpu: 4 + memory: 4096M + networks: + - name: default + pod: {} + volumes: + - name: containervolume + persistentVolumeClaim: + claimName: win22-boot-pvc + - name: datavolume1 + dataVolume: + name: win-disk-1 + - name: datavolume2 + dataVolume: + name: win-disk-2 + - name: datavolume3 + dataVolume: + name: win-disk-3 + - name: datavolume4 + dataVolume: + name: win-disk-4 + - name: datavolume5 + dataVolume: + name: win-disk-5 + - name: datavolume6 + dataVolume: + name: win-disk-6 + - name: datavolume7 + dataVolume: + name: win-disk-7 + - name: datavolume8 + dataVolume: + name: win-disk-8 diff --git a/drivers/scheduler/k8s/specs/kubevirt-win22-forklift/windows-boot-pvc.yaml b/drivers/scheduler/k8s/specs/kubevirt-win22-forklift/windows-boot-pvc.yaml new file mode 100644 index 000000000..bcdf2f1a9 --- /dev/null +++ b/drivers/scheduler/k8s/specs/kubevirt-win22-forklift/windows-boot-pvc.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: win22-boot-pvc + labels: + app: containerized-data-importer + annotations: + cdi.kubevirt.io/storage.import.endpoint: http://pwx-ova.pwx.purestorage.com/templates/qcow2/win2022en-standard-minimal.qcow2 + cdi.kubevirt.io/storage.bind.immediate.requested: "true" + pvc.source: "cloned" +spec: + storageClassName: sv4-wffc-localattach-multi-disk + accessModes: + - ReadWriteMany + resources: + requests: + storage: 50Gi diff --git a/drivers/scheduler/k8s/specs/mysql-backup-psa-restricted/px-mysql-app.yaml b/drivers/scheduler/k8s/specs/mysql-backup-psa-restricted/px-mysql-app.yaml new file mode 100644 index 000000000..75ca7a7a2 --- /dev/null +++ b/drivers/scheduler/k8s/specs/mysql-backup-psa-restricted/px-mysql-app.yaml @@ -0,0 +1,129 @@ +apiVersion: v1 +kind: Service +metadata: + name: mysql + annotations: + startDataSupported: "true" + username: "root" + password: "password" + databaseName: "mysql" + port: "3306" + appType: "mysql" +spec: + type: NodePort + selector: + app: mysql + ports: + - port: 3306 + targetPort: 3306 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: mysql + labels: + app: mysql +spec: + selector: + matchLabels: + app: mysql + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 1 + type: RollingUpdate + replicas: 1 + template: + metadata: + labels: + app: mysql + spec: + schedulerName: stork + securityContext: + seccompProfile: + type: RuntimeDefault + fsGroup: 1010 + containers: + - image: mysql:8.4 + name: mysql + securityContext: + runAsUser: 1010 + runAsNonRoot: true + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + env: + - name: MYSQL_ROOT_PASSWORD + value: password + ports: + - containerPort: 3306 + livenessProbe: + exec: + command: ["sh", "-c", "mysqladmin -u root -p$MYSQL_ROOT_PASSWORD ping"] + initialDelaySeconds: 70 + periodSeconds: 10 + timeoutSeconds: 5 + readinessProbe: + exec: + command: ["sh", "-c", "mysql -u root -p$MYSQL_ROOT_PASSWORD -e \"select 1\""] + initialDelaySeconds: 60 + periodSeconds: 10 + timeoutSeconds: 5 + volumeMounts: + - name: mysql-persistent-storage + mountPath: /var/lib/mysql + - mountPath: /var/lib/mysql-aggr + name: mysql-persistent-storage-aggr + - mountPath: /var/lib/mysql-seq + name: mysql-persistent-storage-seq + volumes: + - name: mysql-persistent-storage + persistentVolumeClaim: + claimName: mysql-data + - name: mysql-persistent-storage-aggr + persistentVolumeClaim: + claimName: mysql-data-aggr + - name: mysql-persistent-storage-seq + persistentVolumeClaim: + claimName: mysql-data-seq +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: mysqlslap + labels: + app: mysqlslap +spec: + selector: + matchLabels: + app: mysqlslap + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 1 + type: RollingUpdate + replicas: 1 + template: + metadata: + labels: + app: mysqlslap + spec: + containers: + - name: mysqlslap + image: portworx/mysqlslap + imagePullPolicy: IfNotPresent + securityContext: + runAsNonRoot: true + runAsUser: 1003 + allowPrivilegeEscalation: false + seccompProfile: + type: RuntimeDefault + capabilities: + drop: + - ALL + env: + - name: MYSQL_ROOT_PASSWORD + value: password + - name: MYSQL_SERVICE_PORT + value: "3306" diff --git a/drivers/scheduler/k8s/specs/mysql-backup-psa-restricted/px-mysql-storage.yaml b/drivers/scheduler/k8s/specs/mysql-backup-psa-restricted/px-mysql-storage.yaml new file mode 100644 index 000000000..e9810461a --- /dev/null +++ b/drivers/scheduler/k8s/specs/mysql-backup-psa-restricted/px-mysql-storage.yaml @@ -0,0 +1,37 @@ + +##### Portworx persistent volume claim +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: mysql-data +spec: + storageClassName: mysql-sc + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 2Gi +--- +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: mysql-data-seq +spec: + storageClassName: mysql-sc-seq + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 2Gi +--- +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: mysql-data-aggr +spec: + storageClassName: mysql-sc-aggr + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 2Gi diff --git a/drivers/scheduler/k8s/specs/mysql-backup-psa-restricted/pxd/px-storage-class.yaml b/drivers/scheduler/k8s/specs/mysql-backup-psa-restricted/pxd/px-storage-class.yaml new file mode 100644 index 000000000..c2ae14fce --- /dev/null +++ b/drivers/scheduler/k8s/specs/mysql-backup-psa-restricted/pxd/px-storage-class.yaml @@ -0,0 +1,42 @@ +##### Portworx storage class +kind: StorageClass +apiVersion: storage.k8s.io/v1 +metadata: + name: mysql-sc +provisioner: pxd.portworx.com +parameters: + repl: "3" + priority_io: "high" + io_profile: "db" +allowVolumeExpansion: true +--- +kind: StorageClass +apiVersion: storage.k8s.io/v1 +metadata: + name: mysql-sc-aggr +provisioner: pxd.portworx.com +parameters: + fs: "ext4" + block_size: "512b" + repl: "1" + aggregation_level: "1" + io_profile: "random" + priority_io: "high" + snap_schedule: "periodic=60,5" + labels: "type=aggregated" +allowVolumeExpansion: true +--- +kind: StorageClass +apiVersion: storage.k8s.io/v1 +metadata: + name: mysql-sc-seq +provisioner: pxd.portworx.com +parameters: + fs: "xfs" + repl: "3" + aggregation_level: "1" + io_profile: "sequential" + priority_io: "high" + snap_schedule: "daily=12:00,7" + labels: "type=replicated" +allowVolumeExpansion: true diff --git a/drivers/scheduler/k8s/specs/mysql-backup/px-mysql-app.yaml b/drivers/scheduler/k8s/specs/mysql-backup/px-mysql-app.yaml index f8f7f6aa7..d2ec28b74 100644 --- a/drivers/scheduler/k8s/specs/mysql-backup/px-mysql-app.yaml +++ b/drivers/scheduler/k8s/specs/mysql-backup/px-mysql-app.yaml @@ -100,7 +100,7 @@ spec: spec: containers: - name: mysqlslap - image: adityadani/mysqlslap + image: portworx/mysqlslap imagePullPolicy: IfNotPresent env: - name: MYSQL_ROOT_PASSWORD diff --git a/drivers/scheduler/k8s/specs/mysql-ibm/mysql-app.yaml b/drivers/scheduler/k8s/specs/mysql-ibm/mysql-app.yaml index 34467492a..b75389836 100644 --- a/drivers/scheduler/k8s/specs/mysql-ibm/mysql-app.yaml +++ b/drivers/scheduler/k8s/specs/mysql-ibm/mysql-app.yaml @@ -82,7 +82,7 @@ spec: spec: containers: - name: mysqlslap - image: adityadani/mysqlslap + image: portworx/mysqlslap imagePullPolicy: IfNotPresent env: - name: MYSQL_ROOT_PASSWORD diff --git a/drivers/scheduler/k8s/specs/mysql-without-enc/px-mysql-app.yaml b/drivers/scheduler/k8s/specs/mysql-without-enc/px-mysql-app.yaml index eeda27411..358f1b81f 100644 --- a/drivers/scheduler/k8s/specs/mysql-without-enc/px-mysql-app.yaml +++ b/drivers/scheduler/k8s/specs/mysql-without-enc/px-mysql-app.yaml @@ -93,7 +93,7 @@ spec: spec: containers: - name: mysqlslap - image: adityadani/mysqlslap + image: portworx/mysqlslap imagePullPolicy: IfNotPresent env: - name: MYSQL_ROOT_PASSWORD diff --git a/drivers/scheduler/k8s/specs/mysql/px-mysql-app.yaml b/drivers/scheduler/k8s/specs/mysql/px-mysql-app.yaml index eeda27411..358f1b81f 100644 --- a/drivers/scheduler/k8s/specs/mysql/px-mysql-app.yaml +++ b/drivers/scheduler/k8s/specs/mysql/px-mysql-app.yaml @@ -93,7 +93,7 @@ spec: spec: containers: - name: mysqlslap - image: adityadani/mysqlslap + image: portworx/mysqlslap imagePullPolicy: IfNotPresent env: - name: MYSQL_ROOT_PASSWORD diff --git a/drivers/scheduler/k8s/specs/postgres-azure-disk-zone/azure/azure-storage-class.yaml b/drivers/scheduler/k8s/specs/postgres-azure-disk-zone/azure/azure-storage-class.yaml new file mode 100644 index 000000000..6fe69a46a --- /dev/null +++ b/drivers/scheduler/k8s/specs/postgres-azure-disk-zone/azure/azure-storage-class.yaml @@ -0,0 +1,11 @@ +##### Azure storage class +apiVersion: storage.k8s.io/v1 +kind: StorageClass +metadata: + name: postgres-sc-zrs +provisioner: disk.csi.azure.com +parameters: + storageaccounttype: StandardSSD_ZRS +reclaimPolicy: Delete +volumeBindingMode: WaitForFirstConsumer +allowVolumeExpansion: true \ No newline at end of file diff --git a/drivers/scheduler/k8s/specs/postgres-azure-disk-zone/postgres-azure-zrsdisk-app.yaml b/drivers/scheduler/k8s/specs/postgres-azure-disk-zone/postgres-azure-zrsdisk-app.yaml new file mode 100644 index 000000000..0fd5e23d5 --- /dev/null +++ b/drivers/scheduler/k8s/specs/postgres-azure-disk-zone/postgres-azure-zrsdisk-app.yaml @@ -0,0 +1,61 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: postgres +spec: + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 1 + type: RollingUpdate + replicas: 1 + selector: + matchLabels: + app: postgres + template: + metadata: + labels: + app: postgres + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: "app" + operator: In + values: + - postgres + topologyKey: "kubernetes.io/hostname" + containers: + - name: postgres + image: postgres:9.5 + imagePullPolicy: "IfNotPresent" + ports: + - containerPort: 5432 + env: + - name: POSTGRES_USER + value: pgbench + - name: POSTGRES_PASSWORD + value: superpostgres + - name: PGBENCH_PASSWORD + value: superpostgres + - name: PGDATA + value: /var/lib/postgresql/data/pgdata + volumeMounts: + - mountPath: /var/lib/postgresql/data + name: postgredb + readinessProbe: + exec: + command: ["psql", "-U", "pgbench", "-c", "CREATE TABLE IF NOT EXISTS test_table ( test_text TEXT ); INSERT INTO test_table VALUES ( 'test_message' ); SELECT * FROM test_table; SELECT pg_sleep(1); DELETE FROM test_table;"] + initialDelaySeconds: 15 + timeoutSeconds: 2 + livenessProbe: + exec: + command: ["psql", "-U", "pgbench", "-c", "CREATE TABLE IF NOT EXISTS test_table ( test_text TEXT ); INSERT INTO test_table VALUES ( 'test_message' ); SELECT * FROM test_table; SELECT pg_sleep(1); DELETE FROM test_table;"] + initialDelaySeconds: 45 + timeoutSeconds: 2 + volumes: + - name: postgredb + persistentVolumeClaim: + claimName: postgres-data diff --git a/drivers/scheduler/k8s/specs/postgres-azure-disk-zone/storage.yaml b/drivers/scheduler/k8s/specs/postgres-azure-disk-zone/storage.yaml new file mode 100644 index 000000000..cdad1d421 --- /dev/null +++ b/drivers/scheduler/k8s/specs/postgres-azure-disk-zone/storage.yaml @@ -0,0 +1,12 @@ +##### Portworx persistent volume claim +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: postgres-data +spec: + storageClassName: postgres-sc-zrs + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 2Gi diff --git a/drivers/scheduler/k8s/specs/postgres-backup-psa-restricted/px-postgres-app.yaml b/drivers/scheduler/k8s/specs/postgres-backup-psa-restricted/px-postgres-app.yaml new file mode 100644 index 000000000..a05779085 --- /dev/null +++ b/drivers/scheduler/k8s/specs/postgres-backup-psa-restricted/px-postgres-app.yaml @@ -0,0 +1,92 @@ +apiVersion: v1 +kind: Service +metadata: + name: postgres + annotations: + startDataSupported: "true" + username: "pgbench" + password: "superpostgres" + databaseName: "postgres" + port: "5432" + appType: "postgres" +spec: + type: NodePort + selector: + app: postgres + ports: + - port: 5432 + targetPort: 5432 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: postgres +spec: + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 1 + type: RollingUpdate + replicas: 1 + selector: + matchLabels: + app: postgres + template: + metadata: + labels: + app: postgres + spec: + schedulerName: stork + securityContext: + seccompProfile: + type: RuntimeDefault + fsGroup: 1003 + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: "app" + operator: In + values: + - postgres + topologyKey: "kubernetes.io/hostname" + containers: + - name: postgres + image: postgres:16.0 + imagePullPolicy: "IfNotPresent" + securityContext: + runAsNonRoot: true + runAsUser: 1003 + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + ports: + - containerPort: 5432 + env: + - name: POSTGRES_USER + value: pgbench + - name: POSTGRES_PASSWORD + value: superpostgres + - name: PGBENCH_PASSWORD + value: superpostgres + - name: PGDATA + value: /var/lib/postgresql/data/pgdata + volumeMounts: + - mountPath: /var/lib/postgresql/data + name: postgredb + readinessProbe: + exec: + command: ["psql", "-U", "pgbench", "-c", "CREATE TABLE IF NOT EXISTS test_table ( test_text TEXT ); INSERT INTO test_table VALUES ( 'test_message' ); SELECT * FROM test_table; SELECT pg_sleep(1); DELETE FROM test_table;"] + initialDelaySeconds: 15 + timeoutSeconds: 2 + livenessProbe: + exec: + command: ["psql", "-U", "pgbench", "-c", "CREATE TABLE IF NOT EXISTS test_table ( test_text TEXT ); INSERT INTO test_table VALUES ( 'test_message' ); SELECT * FROM test_table; SELECT pg_sleep(1); DELETE FROM test_table;"] + initialDelaySeconds: 45 + timeoutSeconds: 2 + volumes: + - name: postgredb + persistentVolumeClaim: + claimName: postgres-data diff --git a/drivers/scheduler/k8s/specs/postgres-backup-psa-restricted/pxd/px-storage-class.yaml b/drivers/scheduler/k8s/specs/postgres-backup-psa-restricted/pxd/px-storage-class.yaml new file mode 100644 index 000000000..3a84b91e8 --- /dev/null +++ b/drivers/scheduler/k8s/specs/postgres-backup-psa-restricted/pxd/px-storage-class.yaml @@ -0,0 +1,10 @@ +##### Portworx storage class +kind: StorageClass +apiVersion: storage.k8s.io/v1 +metadata: + name: postgres-sc +provisioner: pxd.portworx.com +parameters: + repl: "3" + priority_io: "high" +allowVolumeExpansion: true diff --git a/drivers/scheduler/k8s/specs/postgres-backup-psa-restricted/storage.yaml b/drivers/scheduler/k8s/specs/postgres-backup-psa-restricted/storage.yaml new file mode 100644 index 000000000..1f5a8e7fb --- /dev/null +++ b/drivers/scheduler/k8s/specs/postgres-backup-psa-restricted/storage.yaml @@ -0,0 +1,12 @@ +##### Portworx persistent volume claim +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: postgres-data +spec: + storageClassName: postgres-sc + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 2Gi diff --git a/drivers/scheduler/k8s/specs/postgres-fbda-ep/pure/pure-storage-class.yaml b/drivers/scheduler/k8s/specs/postgres-fbda-ep/pure/pure-storage-class.yaml new file mode 100644 index 000000000..1dc8439cf --- /dev/null +++ b/drivers/scheduler/k8s/specs/postgres-fbda-ep/pure/pure-storage-class.yaml @@ -0,0 +1,17 @@ +##### Portworx Storage Class for FBDA +kind: StorageClass +apiVersion: storage.k8s.io/v1 +metadata: + name: px-sc-fbda-ep +provisioner: pxd.portworx.com +parameters: + backend: "pure_file" + pure_export_rules: "*(no_root_squash,rw)" + {{ if .StorageClassPureNfsEndpoint}} + pure_nfs_endpoint: "{{ .StorageClassPureNfsEndpoint }}" + {{ end }} +mountOptions: + - nfsvers=4.1 + - tcp +volumeBindingMode: Immediate +allowVolumeExpansion: true diff --git a/drivers/scheduler/k8s/specs/postgres-fbda-ep/px-postgres-app.yaml b/drivers/scheduler/k8s/specs/postgres-fbda-ep/px-postgres-app.yaml new file mode 100644 index 000000000..66ead7ee4 --- /dev/null +++ b/drivers/scheduler/k8s/specs/postgres-fbda-ep/px-postgres-app.yaml @@ -0,0 +1,62 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: postgres +spec: + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 1 + type: RollingUpdate + replicas: 1 + selector: + matchLabels: + app: postgres + template: + metadata: + labels: + app: postgres + spec: + schedulerName: stork + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: "app" + operator: In + values: + - postgres + topologyKey: "kubernetes.io/hostname" + containers: + - name: postgres + image: postgres:9.5 + imagePullPolicy: "IfNotPresent" + ports: + - containerPort: 5432 + env: + - name: POSTGRES_USER + value: pgbench + - name: POSTGRES_PASSWORD + value: superpostgres + - name: PGBENCH_PASSWORD + value: superpostgres + - name: PGDATA + value: /var/lib/postgresql/data/pgdata + volumeMounts: + - mountPath: /var/lib/postgresql/data + name: postgredb + readinessProbe: + exec: + command: ["psql", "-U", "pgbench", "-c", "CREATE TABLE IF NOT EXISTS test_table ( test_text TEXT ); INSERT INTO test_table VALUES ( 'test_message' ); SELECT * FROM test_table; SELECT pg_sleep(1); DELETE FROM test_table;"] + initialDelaySeconds: 60 + timeoutSeconds: 2 + livenessProbe: + exec: + command: ["psql", "-U", "pgbench", "-c", "CREATE TABLE IF NOT EXISTS test_table ( test_text TEXT ); INSERT INTO test_table VALUES ( 'test_message' ); SELECT * FROM test_table; SELECT pg_sleep(1); DELETE FROM test_table;"] + initialDelaySeconds: 60 + timeoutSeconds: 2 + volumes: + - name: postgredb + persistentVolumeClaim: + claimName: postgres-data diff --git a/drivers/scheduler/k8s/specs/postgres-fbda-ep/storage.yaml b/drivers/scheduler/k8s/specs/postgres-fbda-ep/storage.yaml new file mode 100644 index 000000000..2284b75f7 --- /dev/null +++ b/drivers/scheduler/k8s/specs/postgres-fbda-ep/storage.yaml @@ -0,0 +1,12 @@ +##### Portworx persistent volume claim +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: postgres-data +spec: + storageClassName: px-sc-fbda-ep + accessModes: + - ReadWriteMany + resources: + requests: + storage: 2Gi diff --git a/drivers/scheduler/k8s/specs/snap-mysql/px-mysql-app.yaml b/drivers/scheduler/k8s/specs/snap-mysql/px-mysql-app.yaml index 9abc8d8e6..d0671363d 100644 --- a/drivers/scheduler/k8s/specs/snap-mysql/px-mysql-app.yaml +++ b/drivers/scheduler/k8s/specs/snap-mysql/px-mysql-app.yaml @@ -83,7 +83,7 @@ spec: spec: containers: - name: mysqlslap - image: adityadani/mysqlslap + image: portworx/mysqlslap imagePullPolicy: IfNotPresent env: - name: MYSQL_ROOT_PASSWORD diff --git a/drivers/scheduler/k8s/specs/vdbench-fbda-ep/pure/pure-storage-class.yaml b/drivers/scheduler/k8s/specs/vdbench-fbda-ep/pure/pure-storage-class.yaml new file mode 100644 index 000000000..d05f9e76c --- /dev/null +++ b/drivers/scheduler/k8s/specs/vdbench-fbda-ep/pure/pure-storage-class.yaml @@ -0,0 +1,15 @@ +##### Portworx Storage Class for FBDA +kind: StorageClass +apiVersion: storage.k8s.io/v1 +metadata: + name: px-sc-fbda-ep +provisioner: pxd.portworx.com +parameters: + backend: "pure_file" + pure_export_rules: "*(no_root_squash,rw)" + pure_nfs_endpoint: "{{ .StorageClassPureNfsEndpoint }}" +mountOptions: + - nfsvers=4.1 + - tcp +volumeBindingMode: Immediate +allowVolumeExpansion: true diff --git a/drivers/scheduler/k8s/specs/vdbench-fbda-ep/px-vdbench-app.yaml b/drivers/scheduler/k8s/specs/vdbench-fbda-ep/px-vdbench-app.yaml new file mode 100644 index 000000000..ae7a75a49 --- /dev/null +++ b/drivers/scheduler/k8s/specs/vdbench-fbda-ep/px-vdbench-app.yaml @@ -0,0 +1,63 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: vdbench-fb-volumes +spec: + progressDeadlineSeconds: 600 + replicas: 2 + revisionHistoryLimit: 10 + selector: + matchLabels: + app: vdbench-fb-volumes + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + creationTimestamp: null + labels: + app: vdbench-fb-volumes + spec: + containers: + - args: + - | + while true; do + dd if=/dev/urandom of=/tmp/pvc-fbda-1/file-$(date +%s).txt bs=1M count=1 & + dd if=/dev/urandom of=/tmp/pvc-fbda-2/file-$(date +%s).txt bs=1M count=1 & + sleep 500; + done + command: + - /bin/sh + - -c + image: portworx/vdbench:torpedo + imagePullPolicy: IfNotPresent + name: vdbench + resources: + limits: + cpu: "1" + memory: 500Mi + requests: + cpu: 100m + memory: 256Mi + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /tmp/pvc-fbda-1 + name: pvc-fbda-1 + - mountPath: /tmp/pvc-fbda-2 + name: pvc-fbda-2 + dnsPolicy: ClusterFirst + restartPolicy: Always + schedulerName: stork + securityContext: + fsGroupChangePolicy: OnRootMismatch + terminationGracePeriodSeconds: 30 + volumes: + - name: pvc-fbda-1 + persistentVolumeClaim: + claimName: pvc-fbda-1 + - name: pvc-fbda-2 + persistentVolumeClaim: + claimName: pvc-fbda-2 diff --git a/drivers/scheduler/k8s/specs/vdbench-fbda-ep/storage.yaml b/drivers/scheduler/k8s/specs/vdbench-fbda-ep/storage.yaml new file mode 100644 index 000000000..94c3bb114 --- /dev/null +++ b/drivers/scheduler/k8s/specs/vdbench-fbda-ep/storage.yaml @@ -0,0 +1,25 @@ +##### Portworx persistent volume claim +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: pvc-fbda-1 +spec: + storageClassName: px-sc-fbda-ep + accessModes: + - ReadWriteMany + resources: + requests: + storage: 5Gi + +--- +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: pvc-fbda-2 +spec: + storageClassName: px-sc-fbda-ep + accessModes: + - ReadWriteMany + resources: + requests: + storage: 5Gi diff --git a/drivers/scheduler/openshift/openshift.go b/drivers/scheduler/openshift/openshift.go index 578427a51..28e2f2e91 100644 --- a/drivers/scheduler/openshift/openshift.go +++ b/drivers/scheduler/openshift/openshift.go @@ -2,7 +2,6 @@ package openshift import ( "fmt" - "github.com/portworx/torpedo/pkg/errors" "io/ioutil" "net/http" "os/exec" @@ -1139,54 +1138,6 @@ func getMachineSetName() (string, error) { } -// ScaleCluster scale the cluster to the given replicas -func (k *openshift) ScaleCluster(replicas int) error { - - initialMachineCount, err := k.getMachinesCount() - - machineSetName, err := getMachineSetName() - if err != nil { - return err - } - // kubectl scale machineset leela-ocp-vx6zf-worker-0 --replicas 6 -n openshift-machine-api - cmd := fmt.Sprintf("kubectl -n %s scale %s --replicas %d", OpenshiftMachineNamespace, machineSetName, replicas) - log.Infof("Executing command [%s]", cmd) - output, err := exec.Command("sh", "-c", cmd).CombinedOutput() - if err != nil { - return err - } - log.Infof("output: %s", string(output)) - - if !strings.Contains(string(output), fmt.Sprintf("%s scaled", machineSetName)) { - return fmt.Errorf("failed to scale [%s], output: %s", machineSetName, string(output)) - } - - log.Infof("waiting for new machine to be created") - - t := func() (interface{}, bool, error) { - newMachineCount, err := k.getMachinesCount() - if err != nil { - return "", true, fmt.Errorf("error getting machine count, Err: %v", err) - } - if newMachineCount <= initialMachineCount { - return "", true, fmt.Errorf("waiting for new machine to provision initial count : [%d], current count: [%d]", initialMachineCount, newMachineCount) - } - return "", false, nil - } - if _, err := task.DoRetryWithTimeout(t, 5*time.Minute, 10*time.Second); err != nil { - return err - } - - if _, err := k.checkAndGetNewNode(); err != nil { - return err - } - if err := k.RefreshNodeRegistry(); err != nil { - return err - } - - return nil -} - // needOcpPrereq checks if we need to do OCP Prometheus prereq and returns true or false func (k *openshift) needOcpPrereq(ocpVer string) (bool, error) { log.Infof("Checking if OCP version [%s] requires Prometheus configuration changes...", ocpVer) @@ -1345,10 +1296,72 @@ func updatePrometheusAndAutopilot() error { return nil } -func (k *openshift) SetASGClusterSize(perZoneCount int64, timeout time.Duration) error { - // ScaleCluster is not supported - return &errors.ErrNotSupported{ - Type: "Function", - Operation: "SetASGClusterSize()", +func (k *openshift) SetASGClusterSize(replicas int64, timeout time.Duration) error { + initialMachineCount, err := k.getMachinesCount() + if err != nil { + return err + } + + machineSetName, err := getMachineSetName() + if err != nil { + return err + } + // kubectl scale machineset leela-ocp-vx6zf-worker-0 --replicas 6 -n openshift-machine-api + cmd := fmt.Sprintf("kubectl -n %s scale %s --replicas %d", OpenshiftMachineNamespace, machineSetName, replicas) + log.Infof("Executing command [%s]", cmd) + output, err := exec.Command("sh", "-c", cmd).CombinedOutput() + if err != nil { + return err + } + log.Infof("output: %s", string(output)) + + if !strings.Contains(string(output), fmt.Sprintf("%s scaled", machineSetName)) { + return fmt.Errorf("failed to scale [%s], output: %s", machineSetName, string(output)) + } + + log.Infof("waiting for new machine to be created") + + t := func() (interface{}, bool, error) { + newMachineCount, err := k.getMachinesCount() + if err != nil { + return "", true, fmt.Errorf("error getting machine count, Err: %v", err) + } + if newMachineCount <= initialMachineCount { + return "", true, fmt.Errorf("waiting for new machine to provision initial count : [%d], current count: [%d]", initialMachineCount, newMachineCount) + } + return "", false, nil + } + if _, err := task.DoRetryWithTimeout(t, 5*time.Minute, 10*time.Second); err != nil { + return err + } + + if _, err := k.checkAndGetNewNode(); err != nil { + return err + } + + return nil +} + +func (k *openshift) GetASGClusterSize() (int64, error) { + machineCount, err := k.getMachinesCount() + if err != nil { + return 0, err + } + + return int64(machineCount), nil +} + +func (k *openshift) GetZones() ([]string, error) { + //OCP has one zone + return []string{"zone-1"}, nil +} + +func (k *openshift) Init(schedOpts scheduler.InitOptions) error { + + err := k.K8s.Init(schedOpts) + if err != nil { + return err } + + return nil } diff --git a/drivers/scheduler/scheduler.go b/drivers/scheduler/scheduler.go index 147b736d5..9a0a99ee3 100644 --- a/drivers/scheduler/scheduler.go +++ b/drivers/scheduler/scheduler.go @@ -67,20 +67,22 @@ func (in *Context) GetID() string { // AppConfig custom settings type AppConfig struct { - Replicas int `yaml:"replicas"` - VolumeSize string `yaml:"volume_size"` - WorkloadSize string `yaml:"workload_size"` - ClaimsCount int `yaml:"claims_count"` - CustomCommand []string `yaml:"custom_command"` - CustomArgs []string `yaml:"custom_args"` - StorageClassSharedv4 string `yaml:"storage_class_sharedv4"` - PVCAccessMode string `yaml:"pvc_access_mode"` - Repl string `yaml:"repl"` - Fs string `yaml:"fs"` - AggregationLevel string `yaml:"aggregation_level"` - IoProfile string `yaml:"io_profile"` - Journal string `yaml:"journal"` - DataSize string `yaml:"data_size"` + Replicas int `yaml:"replicas"` + VolumeSize string `yaml:"volume_size"` + WorkloadSize string `yaml:"workload_size"` + ClaimsCount int `yaml:"claims_count"` + CustomCommand []string `yaml:"custom_command"` + CustomArgs []string `yaml:"custom_args"` + StorageClassSharedv4 string `yaml:"storage_class_sharedv4"` + StorageClassPureNfsEndpoint string `yaml:"storage_class_pure_nfs_endpoint"` + PVCAccessMode string `yaml:"pvc_access_mode"` + Repl string `yaml:"repl"` + Fs string `yaml:"fs"` + AggregationLevel string `yaml:"aggregation_level"` + IoProfile string `yaml:"io_profile"` + Journal string `yaml:"journal"` + DataSize string `yaml:"data_size"` + VmID string `yaml:"vm_id"` } // InitOptions initialization options @@ -382,6 +384,9 @@ type Driver interface { // CreateCsiSnapshotClass create csi snapshot class CreateCsiSnapshotClass(snapClassName string, deleionPolicy string) (*volsnapv1.VolumeSnapshotClass, error) + // CreateVolumeSnapshotClasses creates a volume snapshot class + CreateVolumeSnapshotClasses(snapClassName string, provisioner string, isDefault bool, deletePolicy string) (*volsnapv1.VolumeSnapshotClass, error) + // CreateCsiSnapshot create csi snapshot for given pvc // TODO: there's probably better place to place this test, it creates the snapshot and also does the validation. // At the same time, there's also other validation functions in this interface as well. So we should look into ways @@ -401,7 +406,7 @@ type Driver interface { CSICloneTest(*Context, CSICloneRequest) error // WaitForSinglePVCToBound retries and waits up to 30 minutes for a single PVC to be bound - WaitForSinglePVCToBound(pvcName, namespace string) error + WaitForSinglePVCToBound(pvcName, namespace string, timeout int) error // CreateCsiSnapsForVolumes create csi snapshots for all volumes in a context CreateCsiSnapsForVolumes(*Context, string) (map[string]*volsnapv1.VolumeSnapshot, error) @@ -436,8 +441,6 @@ type Driver interface { // GetNamespaceLabel gets the labels on given namespace GetNamespaceLabel(namespace string) (map[string]string, error) - // ScaleCluster scale the cluster to the given replicas - ScaleCluster(replicas int) error // GetZones get the zones of cluster GetZones() ([]string, error) // GetASGClusterSize gets node count for an asg cluster diff --git a/drivers/unifiedPlatform/automationModels/common.go b/drivers/unifiedPlatform/automationModels/common.go index 2bfff75fc..ca55a3edf 100644 --- a/drivers/unifiedPlatform/automationModels/common.go +++ b/drivers/unifiedPlatform/automationModels/common.go @@ -134,7 +134,7 @@ type SortOrder_Value int32 type SourceReferences struct { // UID of the deployment which was backed up. - DeploymentId string `copier:"must,nopanic"` + DataServiceDeploymentId string `copier:"must,nopanic"` // UID of the backup. BackupId string `copier:"must,nopanic"` // UID of the backup location. @@ -147,7 +147,7 @@ type DestinationReferences struct { // UID of the target cluster where restore will be created. TargetClusterId string `copier:"must,nopanic"` // UID of the deployment created by the restore. - DeploymentId string `copier:"must,nopanic"` + DataServiceDeploymentId string `copier:"must,nopanic"` // UID of the project. ProjectId string `copier:"must,nopanic"` } diff --git a/drivers/unifiedPlatform/automationModels/deployments.go b/drivers/unifiedPlatform/automationModels/deployments.go index 173add81f..fe124046a 100644 --- a/drivers/unifiedPlatform/automationModels/deployments.go +++ b/drivers/unifiedPlatform/automationModels/deployments.go @@ -20,7 +20,7 @@ type PDSDeploymentResponse struct { type V1DeploymentUpdate struct { Meta Meta - Config DeploymentUpdateConfig + Config DataServiceDeploymentUpdateConfig Status DeploymentUpdateStatus } @@ -35,9 +35,9 @@ type DeploymentUpdateStatus struct { Phase *Pdsdeploymentconfigupdatev1StatusPhase `copier:"must,nopanic"` } -type DeploymentUpdateConfig struct { - DeploymentMeta Meta `copier:"must,nopanic"` - DeploymentConfig V1Config1 `copier:"must,nopanic"` +type DataServiceDeploymentUpdateConfig struct { + DataServiceDeploymentMeta Meta `copier:"must,nopanic"` + DataServiceDeploymentConfig V1Config1 `copier:"must,nopanic"` } type V1Deployment struct { @@ -55,33 +55,33 @@ type Deploymentv1Status struct { // Initialize used to control startup scripts. Initialized *string `copier:"must,nopanic"` // Status of the deployment topology. - DeploymentTopologyStatus []V1DeploymentTopologyStatus `copier:"must,nopanic"` - CustomResourceName *string `copier:"must,nopanic"` + DataServiceDeploymentTopologyStatus []V1DataServiceDeploymentTopologyStatus `copier:"must,nopanic"` + CustomResourceName *string `copier:"must,nopanic"` } // V1DeploymentTopologyStatus Status of the deployment topology. It is consumed in Deployment. -type V1DeploymentTopologyStatus struct { +type V1DataServiceDeploymentTopologyStatus struct { Health *V1DeploymentTopologyStatusHealth `copier:"must,nopanic"` Phase *V1DeploymentTopologyStatusPhase `copier:"must,nopanic"` // Number of replicas reported by Target Cluster that are up and running. - ReadyReplicas *string `copier:"must,nopanic"` - ConnectionInfo *V1ConnectionInfo `copier:"must,nopanic"` - CustomResourceName *string + ReadyInstances *string `copier:"must,nopanic"` + ConnectionInfo *V1ConnectionInfo `copier:"must,nopanic"` + //CustomResourceName *string } // V1ConnectionInfo Connection Information for the Deployment Topology. type V1ConnectionInfo struct { // Ready pods. - Pods []V1PodInfo `copier:"must,nopanic"` + ReadyInstances []V1InstanceInfo `copier:"must,nopanic"` // Pods that are not ready. - NotReadyPods []V1PodInfo `copier:"must,nopanic"` + NotReadyPods []V1InstanceInfo `copier:"must,nopanic"` ConnectionDetails *V1ConnectionDetails `copier:"must,nopanic"` // Stores details about the cluster. ClusterDetails map[string]interface{} `copier:"must,nopanic"` } // V1PodInfo PodInfo contains information about a pod. -type V1PodInfo struct { +type V1InstanceInfo struct { // The IP of a pod. Ip *string `copier:"must,nopanic"` // Name is the Hostname of a pod. @@ -93,7 +93,7 @@ type V1PodInfo struct { // V1ConnectionDetails ConnectionDetails of data service. type V1ConnectionDetails struct { // Nodes of the data service. - Nodes []string `copier:"must,nopanic"` + Instances []string `copier:"must,nopanic"` // Ports provided by the data service (name and number). Ports *map[string]int32 `copier:"must,nopanic"` } @@ -101,17 +101,25 @@ type V1ConnectionDetails struct { type V1Config1 struct { References Reference `copier:"must,nopanic"` // Flag to enable TLS for the Data Service. - TlsEnabled *bool `copier:"must,nopanic"` + TlsEnabled *V1TLSConfig `copier:"must,nopanic"` // A deployment topology contains a number of nodes that have various attributes as a collective group. - DeploymentTopologies []DeploymentTopology `copier:"must,nopanic"` + DataServiceDeploymentTopologies []V1DataServiceDeploymentTopology `copier:"must,nopanic"` } -type DeploymentTopology struct { +// V1TLSConfig TLS configuration for the Data Service. +type V1TLSConfig struct { + // Flag to enable TLS for the Data Service. + Enabled *bool `json:"enabled,omitempty"` + // Issuer (Certificate Authority) name for the TLS certificates. + IssuerName *string `json:"issuerName,omitempty"` +} + +type V1DataServiceDeploymentTopology struct { Name *string `copier:"must,nopanic"` // Description of the deployment topology. Description *string `copier:"must,nopanic"` // Number of replicas of data services. - Replicas *string `copier:"must,nopanic"` + Instances *string `copier:"must,nopanic"` // Service type are standard Kubernetes service types such as clusterIP, NodePort, load balancers, etc. ServiceType *string `copier:"must,nopanic"` // Service name is the name of service as provided by user. diff --git a/drivers/unifiedPlatform/automationModels/wfDataServiceDetails.go b/drivers/unifiedPlatform/automationModels/wfDataServiceDetails.go deleted file mode 100644 index 43e75cc0f..000000000 --- a/drivers/unifiedPlatform/automationModels/wfDataServiceDetails.go +++ /dev/null @@ -1,3 +0,0 @@ -package automationModels - -//TODO: This needs to be moved to workflow level diff --git a/drivers/unifiedPlatform/pds/backend/v1/api/backup.go b/drivers/unifiedPlatform/pds/backend/v1/api/backup.go index 9ddc60ea0..ec4677f6a 100644 --- a/drivers/unifiedPlatform/pds/backend/v1/api/backup.go +++ b/drivers/unifiedPlatform/pds/backend/v1/api/backup.go @@ -36,7 +36,7 @@ func (backup *PDS_API_V1) ListBackup(listBackupRequest *automationModels.PDSBack } deploymentId := listBackupRequest.List.DeploymentId - listBkpRequest := bkpClient.BackupServiceListBackups(ctx).DeploymentId(deploymentId) + listBkpRequest := bkpClient.BackupServiceListBackups(ctx).DataServiceDeploymentId(deploymentId) if listBackupRequest.List.SortSortBy != "" { listBkpRequest = listBkpRequest.SortSortBy(listBackupRequest.List.SortSortBy) diff --git a/drivers/unifiedPlatform/pds/backend/v1/api/backupConfig.go b/drivers/unifiedPlatform/pds/backend/v1/api/backupConfig.go index a8b13596d..ea3ce296b 100644 --- a/drivers/unifiedPlatform/pds/backend/v1/api/backupConfig.go +++ b/drivers/unifiedPlatform/pds/backend/v1/api/backupConfig.go @@ -24,7 +24,7 @@ func (backupConf *PDS_API_V1) CreateBackupConfig(createBackupConfigRequest *auto } backupCreateRequest := backupClient.BackupConfigServiceCreateBackupConfig(ctx, createBackupConfigRequest.Create.ProjectId) backupCreateRequest = backupCreateRequest.BackupConfigServiceCreateBackupConfigBody(backupConfigV1.BackupConfigServiceCreateBackupConfigBody{ - DeploymentId: createBackupConfigRequest.Create.DeploymentId, + DataServiceDeploymentId: createBackupConfigRequest.Create.DeploymentId, BackupConfig: backupConfigV1.V1BackupConfig{ Meta: &backupConfigV1.V1Meta{ Name: createBackupConfigRequest.Create.BackupConfig.Meta.Name, diff --git a/drivers/unifiedPlatform/pds/backend/v1/api/common.go b/drivers/unifiedPlatform/pds/backend/v1/api/common.go index 7cbefd47a..7af63701a 100644 --- a/drivers/unifiedPlatform/pds/backend/v1/api/common.go +++ b/drivers/unifiedPlatform/pds/backend/v1/api/common.go @@ -7,8 +7,8 @@ import ( backupV1 "github.com/pure-px/platform-api-go-client/pds/v1/backup" backupConfigV1 "github.com/pure-px/platform-api-go-client/pds/v1/backupconfig" catalogV1 "github.com/pure-px/platform-api-go-client/pds/v1/catalog" - deploymentV1 "github.com/pure-px/platform-api-go-client/pds/v1/deployment" - deploymentsConfigUpdateV1 "github.com/pure-px/platform-api-go-client/pds/v1/deploymentconfigupdate" + deploymentV1 "github.com/pure-px/platform-api-go-client/pds/v1/dataservicedeployment" + deploymentsConfigUpdateV1 "github.com/pure-px/platform-api-go-client/pds/v1/dataservicedeploymentconfigupdate" restoreV1 "github.com/pure-px/platform-api-go-client/pds/v1/restore" ) @@ -62,25 +62,25 @@ func (restore *PDS_API_V1) getRestoreClient() (context.Context, *restoreV1.Resto } // GetClient updates the header with bearer token and returns the new client -func (ds *PDS_API_V1) getDeploymentClient() (context.Context, *deploymentV1.DeploymentServiceAPIService, error) { +func (ds *PDS_API_V1) getDeploymentClient() (context.Context, *deploymentV1.DataServiceDeploymentServiceAPIService, error) { ctx, token, err := utils.GetBearerToken() if err != nil { return nil, nil, fmt.Errorf("Error in getting bearer token: %v\n", err) } ds.DeploymentV1APIClient.GetConfig().DefaultHeader = utils.GetDefaultHeader(token, ds.AccountID) - client := ds.DeploymentV1APIClient.DeploymentServiceAPI + client := ds.DeploymentV1APIClient.DataServiceDeploymentServiceAPI return ctx, client, nil } // GetDeploymentConfigClient updates the header with bearer token and returns the new client -func (ds *PDS_API_V1) getDeploymentConfigClient() (context.Context, *deploymentsConfigUpdateV1.DeploymentConfigUpdateServiceAPIService, error) { +func (ds *PDS_API_V1) getDeploymentConfigClient() (context.Context, *deploymentsConfigUpdateV1.DataServiceDeploymentConfigUpdateServiceAPIService, error) { ctx, token, err := utils.GetBearerToken() if err != nil { return nil, nil, fmt.Errorf("Error in getting bearer token: %v\n", err) } ds.DeploymentsConfigUpdateV1APIClient.GetConfig().DefaultHeader = utils.GetDefaultHeader(token, ds.AccountID) - client := ds.DeploymentsConfigUpdateV1APIClient.DeploymentConfigUpdateServiceAPI + client := ds.DeploymentsConfigUpdateV1APIClient.DataServiceDeploymentConfigUpdateServiceAPI return ctx, client, nil } diff --git a/drivers/unifiedPlatform/pds/backend/v1/api/deployments.go b/drivers/unifiedPlatform/pds/backend/v1/api/deployments.go index e1722aa79..77240e5e1 100644 --- a/drivers/unifiedPlatform/pds/backend/v1/api/deployments.go +++ b/drivers/unifiedPlatform/pds/backend/v1/api/deployments.go @@ -8,11 +8,11 @@ import ( "github.com/jinzhu/copier" "github.com/portworx/torpedo/drivers/unifiedPlatform/automationModels" - deploymentV1 "github.com/pure-px/platform-api-go-client/pds/v1/deployment" + deploymentV1 "github.com/pure-px/platform-api-go-client/pds/v1/dataservicedeployment" ) var ( - DeploymentRequest deploymentV1.V1Deployment + DeploymentRequest deploymentV1.V1DataServiceDeployment ) func (ds *PDS_API_V1) GetDeployment(deploymentId string) (*automationModels.PDSDeploymentResponse, error) { @@ -24,7 +24,7 @@ func (ds *PDS_API_V1) GetDeployment(deploymentId string) (*automationModels.PDSD return nil, fmt.Errorf("Error in getting context for backend call: %v\n", err) } - dsModel, res, err := dsClient.DeploymentServiceGetDeployment(ctx, deploymentId).Execute() + dsModel, res, err := dsClient.DataServiceDeploymentServiceGetDataServiceDeployment(ctx, deploymentId).Execute() if err != nil || res.StatusCode != status.StatusOK { return nil, fmt.Errorf("Error when calling `DeploymentServiceGetDeployment`: %v\n.Full HTTP response: %v", err, res) } @@ -43,9 +43,9 @@ func (ds *PDS_API_V1) DeleteDeployment(deploymentId string) error { return fmt.Errorf("Error in getting context for backend call: %v\n", err) } - _, res, err := dsClient.DeploymentServiceDeleteDeployment(ctx, deploymentId).Execute() + _, res, err := dsClient.DataServiceDeploymentServiceDeleteDataServiceDeployment(ctx, deploymentId).Execute() if err != nil || res.StatusCode != status.StatusOK { - return fmt.Errorf("Error when calling `DeploymentServiceCreateDeployment`: %v\n.Full HTTP response: %v", err, res) + return fmt.Errorf("Error when calling `DataServiceDeploymentServiceDeleteDataServiceDeployment`: %v\n.Full HTTP response: %v", err, res) } return nil @@ -60,12 +60,12 @@ func (ds *PDS_API_V1) ListDeployment(projectId string) (*automationModels.PDSDep return nil, fmt.Errorf("Error in getting context for backend call: %v\n", err) } - dsModel, res, err := dsClient.DeploymentServiceListDeployments(ctx).ProjectId(projectId).Execute() + dsModel, res, err := dsClient.DataServiceDeploymentServiceListDataServiceDeployments(ctx).Execute() if err != nil || res.StatusCode != status.StatusOK { - return nil, fmt.Errorf("Error when calling `DeploymentServiceCreateDeployment`: %v\n.Full HTTP response: %v", err, res) + return nil, fmt.Errorf("Error when calling `DataServiceDeploymentServiceCreateDataServiceDeployment`: %v\n.Full HTTP response: %v", err, res) } - err = utilities.CopyStruct(dsModel.Deployments, &dsResponse.List) + err = utilities.CopyStruct(dsModel.DataServiceDeployments, &dsResponse.List) if err != nil { return nil, fmt.Errorf("Error while copying list deployment response: %v\n", err) } @@ -78,7 +78,7 @@ func (ds *PDS_API_V1) CreateDeployment(createDeploymentRequest *automationModels dsResponse := automationModels.PDSDeploymentResponse{ Create: automationModels.V1Deployment{}, } - depCreateRequest := deploymentV1.ApiDeploymentServiceCreateDeploymentRequest{} + depCreateRequest := deploymentV1.ApiDataServiceDeploymentServiceCreateDataServiceDeploymentRequest{} ctx, dsClient, err := ds.getDeploymentClient() if err != nil { @@ -92,19 +92,19 @@ func (ds *PDS_API_V1) CreateDeployment(createDeploymentRequest *automationModels //Debug Print fmt.Println("DeploymentRequestBody Name ", *DeploymentRequest.Meta.Name) - fmt.Println("Storage Template Id: ", *DeploymentRequest.Config.DeploymentTopologies[0].StorageOptions.Id) - fmt.Println("App Template Id: ", *DeploymentRequest.Config.DeploymentTopologies[0].ServiceConfigurations.Id) - fmt.Println("Resource Template Id: ", *DeploymentRequest.Config.DeploymentTopologies[0].ResourceSettings.Id) + fmt.Println("Storage Template Id: ", *DeploymentRequest.Config.DataServiceDeploymentTopologies[0].StorageOptions.Id) + fmt.Println("App Template Id: ", *DeploymentRequest.Config.DataServiceDeploymentTopologies[0].ServiceConfigurations.Id) + fmt.Println("Resource Template Id: ", *DeploymentRequest.Config.DataServiceDeploymentTopologies[0].ResourceSettings.Id) - DeploymentRequestBody := deploymentV1.DeploymentServiceCreateDeploymentBody{ - ProjectId: &createDeploymentRequest.Create.ProjectID, - Deployment: &DeploymentRequest, + DeploymentRequestBody := deploymentV1.DataServiceDeploymentServiceCreateDataServiceDeploymentBody{ + ProjectId: &createDeploymentRequest.Create.ProjectID, + DataServiceDeployment: &DeploymentRequest, } - depCreateRequest = dsClient.DeploymentServiceCreateDeployment(ctx, createDeploymentRequest.Create.NamespaceID).DeploymentServiceCreateDeploymentBody(DeploymentRequestBody) - dsModel, res, err := dsClient.DeploymentServiceCreateDeploymentExecute(depCreateRequest) + depCreateRequest = dsClient.DataServiceDeploymentServiceCreateDataServiceDeployment(ctx, createDeploymentRequest.Create.NamespaceID).DataServiceDeploymentServiceCreateDataServiceDeploymentBody(DeploymentRequestBody) + dsModel, res, err := dsClient.DataServiceDeploymentServiceCreateDataServiceDeploymentExecute(depCreateRequest) if err != nil || res.StatusCode != status.StatusOK { - return nil, fmt.Errorf("Error when calling `DeploymentServiceCreateDeployment`: %v\n.Full HTTP response: %v", err, res) + return nil, fmt.Errorf("Error when calling `DataServiceDeploymentServiceCreateDataServiceDeployment`: %v\n.Full HTTP response: %v", err, res) } log.Debugf("deployment Name [%s]", *dsModel.Status.CustomResourceName) diff --git a/drivers/unifiedPlatform/pds/backend/v1/api/deploymentsConfigUpdate.go b/drivers/unifiedPlatform/pds/backend/v1/api/deploymentsConfigUpdate.go index dc6beed3a..e1b330309 100644 --- a/drivers/unifiedPlatform/pds/backend/v1/api/deploymentsConfigUpdate.go +++ b/drivers/unifiedPlatform/pds/backend/v1/api/deploymentsConfigUpdate.go @@ -4,14 +4,14 @@ import ( "fmt" "github.com/portworx/torpedo/drivers/utilities" "github.com/portworx/torpedo/pkg/log" - deploymentsConfigUpdateV1 "github.com/pure-px/platform-api-go-client/pds/v1/deploymentconfigupdate" + deploymentsConfigUpdateV1 "github.com/pure-px/platform-api-go-client/pds/v1/dataservicedeploymentconfigupdate" status "net/http" "github.com/portworx/torpedo/drivers/unifiedPlatform/automationModels" ) var ( - UpdateDeploymentRequest deploymentsConfigUpdateV1.DeploymentConfigUpdateOfTheDeploymentUpdateRequest + UpdateDeploymentRequest deploymentsConfigUpdateV1.DataServiceDeploymentConfigUpdateOfTheDataServiceConfigDeploymentUpdateRequest ) func (ds *PDS_API_V1) GetDeploymentConfig(updateDeploymentRequest *automationModels.PDSDeploymentRequest) (*automationModels.PDSDeploymentResponse, error) { @@ -24,7 +24,7 @@ func (ds *PDS_API_V1) GetDeploymentConfig(updateDeploymentRequest *automationMod return nil, fmt.Errorf("Error in getting context for backend call: %v\n", err) } - dsModel, res, err := dsClient.DeploymentConfigUpdateServiceGetDeploymentConfigUpdate(ctx, updateDeploymentRequest.Update.DeploymentConfigId).Execute() + dsModel, res, err := dsClient.DataServiceDeploymentConfigUpdateServiceGetDataServiceDeploymentConfigUpdate(ctx, updateDeploymentRequest.Update.DeploymentConfigId).Execute() log.Debugf("updated dsModel [%v]", dsModel) log.Debugf("response [%v]", res) if err != nil || res.StatusCode != status.StatusOK { @@ -53,7 +53,7 @@ func (ds *PDS_API_V1) UpdateDeployment(updateDeploymentRequest *automationModels return nil, fmt.Errorf("Error occured while copying updateDeploymentRequest %v\n", err) } - dsModel, res, err := dsClient.DeploymentConfigUpdateServiceCreateDeploymentConfigUpdate(ctx, updateDeploymentRequest.Update.DeploymentID).DeploymentConfigUpdateOfTheDeploymentUpdateRequest(UpdateDeploymentRequest).Execute() + dsModel, res, err := dsClient.DataServiceDeploymentConfigUpdateServiceCreateDataServiceDeploymentConfigUpdate(ctx, updateDeploymentRequest.Update.DeploymentID).DataServiceDeploymentConfigUpdateOfTheDataServiceConfigDeploymentUpdateRequest(UpdateDeploymentRequest).Execute() log.Debugf("updated dsModel [%v]", dsModel) log.Debugf("response [%v]", res) if err != nil || res.StatusCode != status.StatusOK { diff --git a/drivers/unifiedPlatform/pds/backend/v1/api/restore.go b/drivers/unifiedPlatform/pds/backend/v1/api/restore.go index f0467e720..a896a75c4 100644 --- a/drivers/unifiedPlatform/pds/backend/v1/api/restore.go +++ b/drivers/unifiedPlatform/pds/backend/v1/api/restore.go @@ -139,7 +139,7 @@ func (restore *PDS_API_V1) ListRestore(listRestoresRequest *automationModels.PDS } restoreRequest := restoreClient.RestoreServiceListRestores(ctx) - restoreRequest = restoreRequest.DeploymentId(listRestoresRequest.List.DeploymentId) + restoreRequest = restoreRequest.DataServiceDeploymentId(listRestoresRequest.List.DeploymentId) restoreRequest = restoreRequest.BackupId(listRestoresRequest.List.BackupId) restoreRequest = restoreRequest.ProjectId(listRestoresRequest.List.ProjectId) restoreRequest = restoreRequest.TenantId(listRestoresRequest.List.TenantId) diff --git a/drivers/unifiedPlatform/pds/backend/v1/grpc/deployments.go b/drivers/unifiedPlatform/pds/backend/v1/grpc/deployments.go index 76c1f6e04..728e83290 100644 --- a/drivers/unifiedPlatform/pds/backend/v1/grpc/deployments.go +++ b/drivers/unifiedPlatform/pds/backend/v1/grpc/deployments.go @@ -7,15 +7,15 @@ import ( . "github.com/portworx/torpedo/drivers/unifiedPlatform/automationModels" . "github.com/portworx/torpedo/drivers/unifiedPlatform/utils" "github.com/portworx/torpedo/pkg/log" - publicdeploymentapis "github.com/pure-px/apis/public/portworx/pds/deployment/apiv1" - deploymenttopology "github.com/pure-px/apis/public/portworx/pds/deploymenttopology/apiv1" + publicdeploymentapis "github.com/pure-px/apis/public/portworx/pds/dataservicedeployment/apiv1" + deploymenttopology "github.com/pure-px/apis/public/portworx/pds/dataservicedeploymenttopology/apiv1" "google.golang.org/grpc" ) // getDeploymentClient updates the header with bearer token and returns the new client -func (deployment *PdsGrpc) getDeploymentClient() (context.Context, publicdeploymentapis.DeploymentServiceClient, string, error) { +func (deployment *PdsGrpc) getDeploymentClient() (context.Context, publicdeploymentapis.DataServiceDeploymentServiceClient, string, error) { log.Infof("Creating client from grpc package") - var depClient publicdeploymentapis.DeploymentServiceClient + var depClient publicdeploymentapis.DataServiceDeploymentServiceClient ctx, token, err := GetBearerToken() if err != nil { @@ -26,7 +26,7 @@ func (deployment *PdsGrpc) getDeploymentClient() (context.Context, publicdeploym Token: token, } - depClient = publicdeploymentapis.NewDeploymentServiceClient(deployment.ApiClientV2) + depClient = publicdeploymentapis.NewDataServiceDeploymentServiceClient(deployment.ApiClientV2) return ctx, depClient, token, nil } @@ -40,11 +40,11 @@ func (deployment *PdsGrpc) GetDeployment(deploymentId string) (*PDSDeploymentRes return nil, fmt.Errorf("Error while getting grpc client: %v\n", err) } - getRequest := &publicdeploymentapis.GetDeploymentRequest{ + getRequest := &publicdeploymentapis.GetDataServiceDeploymentRequest{ Id: deploymentId, } ctx = WithAccountIDMetaCtx(ctx, deployment.AccountId) - apiResponse, err := client.GetDeployment(ctx, getRequest) + apiResponse, err := client.GetDataServiceDeployment(ctx, getRequest) log.Infof("api response [+%v]", apiResponse) if err != nil { return nil, fmt.Errorf("Error while getting the deployment: %v\n", err) @@ -63,12 +63,12 @@ func (deployment *PdsGrpc) DeleteDeployment(deploymentId string) error { return fmt.Errorf("Error while getting grpc client: %v\n", err) } - deleteRequest := &publicdeploymentapis.DeleteDeploymentRequest{ + deleteRequest := &publicdeploymentapis.DeleteDataServiceDeploymentRequest{ Id: deploymentId, } ctx = WithAccountIDMetaCtx(ctx, deployment.AccountId) - apiResponse, err := client.DeleteDeployment(ctx, deleteRequest) + apiResponse, err := client.DeleteDataServiceDeployment(ctx, deleteRequest) log.Infof("api response [+%v]", apiResponse) if err != nil { return fmt.Errorf("Error while deleting the deployment: %v\n", err) @@ -89,14 +89,13 @@ func (deployment *PdsGrpc) ListDeployment(projectId string) (*PDSDeploymentRespo return nil, fmt.Errorf("Error while getting grpc client: %v\n", err) } - listRequest := &publicdeploymentapis.ListDeploymentsRequest{ - ListBy: nil, + listRequest := &publicdeploymentapis.ListDataServiceDeploymentsRequest{ Pagination: NewPaginationRequest(1, 50), Sort: nil, } ctx = WithAccountIDMetaCtx(ctx, deployment.AccountId) - apiResponse, err := client.ListDeployments(ctx, listRequest, grpc.PerRPCCredentials(credentials)) + apiResponse, err := client.ListDataServiceDeployments(ctx, listRequest, grpc.PerRPCCredentials(credentials)) log.Infof("api response [+%v]", apiResponse) if err != nil { return nil, fmt.Errorf("Error while creating the deployment: %v\n", err) @@ -115,19 +114,19 @@ func (deployment *PdsGrpc) CreateDeployment(createDeploymentRequest *PDSDeployme } dep := createDeploymentRequest.Create.V1Deployment - createRequest := &publicdeploymentapis.CreateDeploymentRequest{ + createRequest := &publicdeploymentapis.CreateDataServiceDeploymentRequest{ NamespaceId: createDeploymentRequest.Create.NamespaceID, - Deployment: &publicdeploymentapis.Deployment{ + DataServiceDeployment: &publicdeploymentapis.DataServiceDeployment{ Meta: nil, Config: &publicdeploymentapis.Config{ References: nil, - DeploymentTopologies: []*deploymenttopology.DeploymentTopology{ + DataServiceDeploymentTopologies: []*deploymenttopology.DataServiceDeploymentTopology{ { Name: *dep.Meta.Name, Description: "", - Replicas: 3, + Instances: 3, ResourceSettings: &deploymenttopology.Template{ - Id: *dep.Config.DeploymentTopologies[0].ResourceSettings.Id, + Id: *dep.Config.DataServiceDeploymentTopologies[0].ResourceSettings.Id, ResourceVersion: "", Values: nil, }, @@ -144,11 +143,11 @@ func (deployment *PdsGrpc) CreateDeployment(createDeploymentRequest *PDSDeployme log.Debugf("Account ID: [%s]", deployment.AccountId) log.Debugf("Namespace ID: [%s]", createDeploymentRequest.Create.NamespaceID) - log.Debugf("workflowrequest ResourceTemplateId: [%s]", *createDeploymentRequest.Create.V1Deployment.Config.DeploymentTopologies[0].ResourceSettings.Id) + log.Debugf("workflowrequest ResourceTemplateId: [%s]", *createDeploymentRequest.Create.V1Deployment.Config.DataServiceDeploymentTopologies[0].ResourceSettings.Id) ctx = WithAccountIDMetaCtx(ctx, deployment.AccountId) - apiResponse, err := client.CreateDeployment(ctx, createRequest, grpc.PerRPCCredentials(credentials)) + apiResponse, err := client.CreateDataServiceDeployment(ctx, createRequest, grpc.PerRPCCredentials(credentials)) log.Infof("api response [+%v]", apiResponse) if err != nil { return nil, fmt.Errorf("Error while creating the deployment: %v\n", err) diff --git a/drivers/unifiedPlatform/pds/backend/v1/grpc/deploymentsConfigUpdate.go b/drivers/unifiedPlatform/pds/backend/v1/grpc/deploymentsConfigUpdate.go index 7aee88e13..c4e4182a2 100644 --- a/drivers/unifiedPlatform/pds/backend/v1/grpc/deploymentsConfigUpdate.go +++ b/drivers/unifiedPlatform/pds/backend/v1/grpc/deploymentsConfigUpdate.go @@ -8,16 +8,16 @@ import ( "github.com/portworx/torpedo/drivers/utilities" "github.com/portworx/torpedo/pkg/log" commonapiv1 "github.com/pure-px/apis/public/portworx/common/apiv1" - publicdeploymentapis "github.com/pure-px/apis/public/portworx/pds/deployment/apiv1" - publicdeploymentConfigUpdate "github.com/pure-px/apis/public/portworx/pds/deploymentconfigupdate/apiv1" - deploymenttopology "github.com/pure-px/apis/public/portworx/pds/deploymenttopology/apiv1" + publicdeploymentapis "github.com/pure-px/apis/public/portworx/pds/dataservicedeployment/apiv1" + publicdeploymentConfigUpdate "github.com/pure-px/apis/public/portworx/pds/dataservicedeploymentconfigupdate/apiv1" + deploymenttopology "github.com/pure-px/apis/public/portworx/pds/dataservicedeploymenttopology/apiv1" "google.golang.org/grpc" ) // GetClient updates the header with bearer token and returns the new client -func (deployment *PdsGrpc) getDeploymentConfigClient() (context.Context, publicdeploymentConfigUpdate.DeploymentConfigUpdateServiceClient, string, error) { +func (deployment *PdsGrpc) getDeploymentConfigClient() (context.Context, publicdeploymentConfigUpdate.DataServiceDeploymentConfigUpdateServiceClient, string, error) { log.Infof("Creating client from grpc package") - var depClient publicdeploymentConfigUpdate.DeploymentConfigUpdateServiceClient + var depClient publicdeploymentConfigUpdate.DataServiceDeploymentConfigUpdateServiceClient ctx, token, err := GetBearerToken() if err != nil { @@ -28,7 +28,7 @@ func (deployment *PdsGrpc) getDeploymentConfigClient() (context.Context, publicd Token: token, } - depClient = publicdeploymentConfigUpdate.NewDeploymentConfigUpdateServiceClient(deployment.ApiClientV2) + depClient = publicdeploymentConfigUpdate.NewDataServiceDeploymentConfigUpdateServiceClient(deployment.ApiClientV2) return ctx, depClient, token, nil } @@ -49,8 +49,8 @@ func (deployment *PdsGrpc) UpdateDeployment(updateDeploymentRequest *automationM } //TODO: try copy else go with the below approach - updateRequest := &publicdeploymentConfigUpdate.CreateDeploymentConfigUpdateRequest{ - DeploymentConfigUpdate: &publicdeploymentConfigUpdate.DeploymentConfigUpdate{ + updateRequest := &publicdeploymentConfigUpdate.CreateDataServiceDeploymentConfigUpdateRequest{ + DataServiceDeploymentConfigUpdate: &publicdeploymentConfigUpdate.DataServiceDeploymentConfigUpdate{ Meta: &commonapiv1.Meta{ Uid: "", Name: "", @@ -64,7 +64,7 @@ func (deployment *PdsGrpc) UpdateDeployment(updateDeploymentRequest *automationM ResourceNames: nil, }, Config: &publicdeploymentConfigUpdate.Config{ - DeploymentMeta: &commonapiv1.Meta{ + DataServiceDeploymentMeta: &commonapiv1.Meta{ Uid: "", Name: "", Description: "", @@ -76,14 +76,14 @@ func (deployment *PdsGrpc) UpdateDeployment(updateDeploymentRequest *automationM ParentReference: nil, ResourceNames: nil, }, - DeploymentConfig: &publicdeploymentapis.Config{ + DataServiceDeploymentConfig: &publicdeploymentapis.Config{ References: nil, //TlsEnabled: false, - DeploymentTopologies: []*deploymenttopology.DeploymentTopology{ + DataServiceDeploymentTopologies: []*deploymenttopology.DataServiceDeploymentTopology{ { Name: "", Description: "", - Replicas: 4, + Instances: 4, ResourceSettings: &deploymenttopology.Template{ Id: "", ResourceVersion: "", @@ -102,7 +102,7 @@ func (deployment *PdsGrpc) UpdateDeployment(updateDeploymentRequest *automationM return nil, fmt.Errorf("Error while c: %v\n", err) } - apiResponse, err := client.CreateDeploymentConfigUpdate(ctx, updateRequest, grpc.PerRPCCredentials(credentials)) + apiResponse, err := client.CreateDataServiceDeploymentConfigUpdate(ctx, updateRequest, grpc.PerRPCCredentials(credentials)) if err != nil { return nil, fmt.Errorf("Error while updating the deployment: %v\n", err) } diff --git a/drivers/unifiedPlatform/pds/backend/v1/grpc/restore.go b/drivers/unifiedPlatform/pds/backend/v1/grpc/restore.go index 937a9b070..3e82e90e1 100644 --- a/drivers/unifiedPlatform/pds/backend/v1/grpc/restore.go +++ b/drivers/unifiedPlatform/pds/backend/v1/grpc/restore.go @@ -144,25 +144,25 @@ func (restore *PdsGrpc) GetRestore(getRestoreRequest *automationModels.PDSRestor func (restore *PdsGrpc) DeleteRestore(deleteRestoreRequest *automationModels.PDSRestoreRequest) error { // log.Infof("Backup Delete - [%+v]", deleteBackupConfigRequest.BackupConfig.Delete) - deleteRequest := &publicRestoreapis.DeleteRestoreRequest{} - // log.Infof("Restore Delete - [%v]", deleteRequest) - err := utilities.CopyStruct(deleteRestoreRequest.Delete, deleteRequest) - if err != nil { - return err - } + //deleteRequest := &publicRestoreapis.DeleteRestoreRequest{} + //// log.Infof("Restore Delete - [%v]", deleteRequest) + //err := utilities.CopyStruct(deleteRestoreRequest.Delete, deleteRequest) + //if err != nil { + // return err + //} // log.Infof("Restore Delete - [%v]", deleteRequest) - ctx, client, _, err := restore.getRestoreClient() - if err != nil { - return fmt.Errorf("Error while getting grpc client: %v\n", err) - } - - ctx = WithAccountIDMetaCtx(ctx, restore.AccountId) - - _, err = client.DeleteRestore(ctx, deleteRequest, grpc.PerRPCCredentials(credentials)) - if err != nil { - return fmt.Errorf("Error while deleting the restore: %v\n", err) - } + //ctx, client, _, err := restore.getRestoreClient() + //if err != nil { + // return fmt.Errorf("Error while getting grpc client: %v\n", err) + //} + // + //ctx = WithAccountIDMetaCtx(ctx, restore.AccountId) + // + //_, err = client.DeleteRestore(ctx, deleteRequest, grpc.PerRPCCredentials(credentials)) + //if err != nil { + // return fmt.Errorf("Error while deleting the restore: %v\n", err) + //} return nil } diff --git a/drivers/unifiedPlatform/pdsLibs/dsLib.go b/drivers/unifiedPlatform/pdsLibs/dsLib.go index 77bdcbf6b..8b22175a1 100644 --- a/drivers/unifiedPlatform/pdsLibs/dsLib.go +++ b/drivers/unifiedPlatform/pdsLibs/dsLib.go @@ -70,18 +70,18 @@ func UpdateDataService(ds PDSDataService, deploymentId, namespaceId, projectId, Meta: automationModels.Meta{ Name: &ds.DeploymentName, }, - Config: automationModels.DeploymentUpdateConfig{ - DeploymentMeta: automationModels.Meta{ + Config: automationModels.DataServiceDeploymentUpdateConfig{ + DataServiceDeploymentMeta: automationModels.Meta{ Description: StringPtr("pds-qa-tests"), }, - DeploymentConfig: automationModels.V1Config1{ + DataServiceDeploymentConfig: automationModels.V1Config1{ References: automationModels.Reference{ ImageId: &imageId, }, - DeploymentTopologies: []automationModels.DeploymentTopology{ + DataServiceDeploymentTopologies: []automationModels.V1DataServiceDeploymentTopology{ { - Name: StringPtr(DEPLOYMENT_TOPOLOGY), - Replicas: intToPointerString(ds.ScaleReplicas), + Name: StringPtr(DEPLOYMENT_TOPOLOGY), + Instances: intToPointerString(ds.ScaleReplicas), ResourceSettings: &automationModels.PdsTemplates{ Id: &resConfigId, }, @@ -137,7 +137,7 @@ func GetDeploymentAndPodDetails(deploymentId string) (*automationModels.PDSDeplo return nil, "", err } log.Debugf("deployment [%+v]", deployment) - pod := deployment.Get.Status.DeploymentTopologyStatus[0].ConnectionInfo.Pods[0].Name + pod := deployment.Get.Status.DataServiceDeploymentTopologyStatus[0].ConnectionInfo.ReadyInstances[0].Name log.Debugf("pods [%+v]", *pod) podName := utilities.GetBasePodName(*pod) return deployment, podName, err @@ -159,10 +159,10 @@ func DeployDataService(ds PDSDataService, namespaceId, projectId, targetClusterI ImageId: &imageId, }, TlsEnabled: nil, - DeploymentTopologies: []automationModels.DeploymentTopology{ + DataServiceDeploymentTopologies: []automationModels.V1DataServiceDeploymentTopology{ { Name: StringPtr(DEPLOYMENT_TOPOLOGY), - Replicas: intToPointerString(ds.Replicas), + Instances: intToPointerString(ds.Replicas), ServiceType: StringPtr(ds.ServiceType), ResourceSettings: &automationModels.PdsTemplates{ Id: &resConfigId, @@ -180,9 +180,9 @@ func DeployDataService(ds PDSDataService, namespaceId, projectId, targetClusterI }, } - log.Infof("app template ids [%s]", *depInputs.Create.V1Deployment.Config.DeploymentTopologies[0].ServiceConfigurations.Id) - log.Infof("resource template ids [%s]", *depInputs.Create.V1Deployment.Config.DeploymentTopologies[0].ResourceSettings.Id) - log.Infof("storage template ids [%s]", *depInputs.Create.V1Deployment.Config.DeploymentTopologies[0].StorageOptions.Id) + log.Infof("app template ids [%s]", *depInputs.Create.V1Deployment.Config.DataServiceDeploymentTopologies[0].ServiceConfigurations.Id) + log.Infof("resource template ids [%s]", *depInputs.Create.V1Deployment.Config.DataServiceDeploymentTopologies[0].ResourceSettings.Id) + log.Infof("storage template ids [%s]", *depInputs.Create.V1Deployment.Config.DataServiceDeploymentTopologies[0].StorageOptions.Id) log.Infof("depInputs [+%v]", depInputs.Create) deployment, err := v2Components.PDS.CreateDeployment(depInputs) diff --git a/drivers/unifiedPlatform/pdsLibs/validateBackupRestore.go b/drivers/unifiedPlatform/pdsLibs/validateBackupRestore.go index 570492835..aea7fc445 100644 --- a/drivers/unifiedPlatform/pdsLibs/validateBackupRestore.go +++ b/drivers/unifiedPlatform/pdsLibs/validateBackupRestore.go @@ -55,24 +55,24 @@ func ValidateRestoreDeployment(restoreId, namespace string) error { } newDeployment := make(map[string]string) - newDeployment[*restore.Get.Meta.Name] = restore.Get.Config.DestinationReferences.DeploymentId + newDeployment[*restore.Get.Meta.Name] = restore.Get.Config.DestinationReferences.DataServiceDeploymentId - err = ValidateDataServiceDeploymentHealth(restore.Get.Config.DestinationReferences.DeploymentId, PDS_DEPLOYMENT_AVAILABLE) + err = ValidateDataServiceDeploymentHealth(restore.Get.Config.DestinationReferences.DataServiceDeploymentId, PDS_DEPLOYMENT_AVAILABLE) if err != nil { return fmt.Errorf("error while validating restored deployment readiness") } - sourceDeployment, err := GetDeployment(restore.Get.Config.SourceReferences.DeploymentId) + sourceDeployment, err := GetDeployment(restore.Get.Config.SourceReferences.DataServiceDeploymentId) if err != nil { return fmt.Errorf("error while fetching source deployment object") } - destinationDeployment, err := GetDeployment(restore.Get.Config.DestinationReferences.DeploymentId) + destinationDeployment, err := GetDeployment(restore.Get.Config.DestinationReferences.DataServiceDeploymentId) if err != nil { return fmt.Errorf("error while fetching destination deployment object") } - err = ValidateRestore(sourceDeployment.Get.Config.DeploymentTopologies[0], destinationDeployment.Get.Config.DeploymentTopologies[0]) + err = ValidateRestore(sourceDeployment.Get.Config.DataServiceDeploymentTopologies[0], destinationDeployment.Get.Config.DataServiceDeploymentTopologies[0]) if err != nil { return fmt.Errorf("error while validation data service entities(i.e App config, resource etc). Err: %v", err) } @@ -81,23 +81,23 @@ func ValidateRestoreDeployment(restoreId, namespace string) error { } // ValidateRestoreAfterSourceDeploymentUpgrade Validates the restored deployment config with source deployment config before upgrade -func ValidateRestoreAfterSourceDeploymentUpgrade(restoreId string, sourceDeploymentConfig automationModels.DeploymentTopology) error { +func ValidateRestoreAfterSourceDeploymentUpgrade(restoreId string, sourceDeploymentConfig automationModels.V1DataServiceDeploymentTopology) error { restore, err := ValidateRestoreStatus(restoreId) if err != nil { return err } - err = ValidateDataServiceDeploymentHealth(restore.Get.Config.DestinationReferences.DeploymentId, PDS_DEPLOYMENT_AVAILABLE) + err = ValidateDataServiceDeploymentHealth(restore.Get.Config.DestinationReferences.DataServiceDeploymentId, PDS_DEPLOYMENT_AVAILABLE) if err != nil { return fmt.Errorf("error while validating restored deployment readiness") } - destinationDeployment, err := GetDeployment(restore.Get.Config.DestinationReferences.DeploymentId) + destinationDeployment, err := GetDeployment(restore.Get.Config.DestinationReferences.DataServiceDeploymentId) if err != nil { return fmt.Errorf("error while fetching destination deployment object") } - err = ValidateRestore(sourceDeploymentConfig, destinationDeployment.Get.Config.DeploymentTopologies[0]) + err = ValidateRestore(sourceDeploymentConfig, destinationDeployment.Get.Config.DataServiceDeploymentTopologies[0]) if err != nil { return fmt.Errorf("error while validation data service entities(i.e App config, resource etc). Err: %v", err) } @@ -106,7 +106,7 @@ func ValidateRestoreAfterSourceDeploymentUpgrade(restoreId string, sourceDeploym } // ValidateRestore validates the Resource, App and Storage configurations of source and destination deployments -func ValidateRestore(sourceDep, destDep automationModels.DeploymentTopology) error { +func ValidateRestore(sourceDep, destDep automationModels.V1DataServiceDeploymentTopology) error { //TODO : This validation needs to be revisited once we have the working pds templates api @@ -145,8 +145,8 @@ func ValidateRestore(sourceDep, destDep automationModels.DeploymentTopology) err } // Validate the replicas - sourceReplicas := sourceDep.Replicas - destReplicas := destDep.Replicas + sourceReplicas := sourceDep.Instances + destReplicas := destDep.Instances log.Debugf("source replicas [%d], dest repicas [%d]", *sourceReplicas, *destReplicas) if *sourceReplicas != *destReplicas { return fmt.Errorf("restored replicas are not same as backed up resource config") diff --git a/drivers/unifiedPlatform/pdsLibs/validateDataService.go b/drivers/unifiedPlatform/pdsLibs/validateDataService.go index 800d33916..ab28a638b 100644 --- a/drivers/unifiedPlatform/pdsLibs/validateDataService.go +++ b/drivers/unifiedPlatform/pdsLibs/validateDataService.go @@ -194,12 +194,12 @@ func ValidateDataServiceDeploymentHealth(deploymentId string, expectedHealth aut return false, nil } if *res.Get.Status.Phase == stworkflows.FAILED { - log.Infof("Deployment details: Health status - %v, Replicas - %v, Ready replicas - %v", *res.Get.Status.Health, *res.Get.Config.DeploymentTopologies[0].Replicas, *res.Get.Status.DeploymentTopologyStatus[0].ReadyReplicas) + log.Infof("Deployment details: Health status - %v, Replicas - %v, Ready replicas - %v", *res.Get.Status.Health, *res.Get.Config.DataServiceDeploymentTopologies[0].Instances, *res.Get.Status.DataServiceDeploymentTopologyStatus[0].ReadyInstances) return true, fmt.Errorf("Deployment [%s] is [%s]", *res.Get.Meta.Name, *res.Get.Status.Phase) } log.Debugf("Health status - [%v]", *res.Get.Status.Health) if *res.Get.Status.Health == expectedHealth { - log.Infof("Deployment details: Health status - %v, Replicas - %v, Ready replicas - %v", *res.Get.Status.Health, *res.Get.Config.DeploymentTopologies[0].Replicas, *res.Get.Status.DeploymentTopologyStatus[0].ReadyReplicas) + log.Infof("Deployment details: Health status - %v, Replicas - %v, Ready replicas - %v", *res.Get.Status.Health, *res.Get.Config.DataServiceDeploymentTopologies[0].Instances, *res.Get.Status.DataServiceDeploymentTopologyStatus[0].ReadyInstances) if ResiFlag { ResiliencyCondition <- true log.InfoD("Resiliency Condition Met") @@ -228,10 +228,10 @@ func ValidateDeploymentIsDeleted(deploymentId string) error { return true, nil } log.Debugf("Health status - %v", *res.Get.Status.Health) - if *res.Get.Config.DeploymentTopologies[0].Replicas != *res.Get.Status.DeploymentTopologyStatus[0].ReadyReplicas || *res.Get.Status.Health != PDS_DEPLOYMENT_AVAILABLE { + if *res.Get.Config.DataServiceDeploymentTopologies[0].Instances != *res.Get.Status.DataServiceDeploymentTopologyStatus[0].ReadyInstances || *res.Get.Status.Health != PDS_DEPLOYMENT_AVAILABLE { return false, nil } - log.Infof("Deployment details: Health status - %v, Replicas - %v, Ready replicas - %v", *res.Get.Status.Health, *res.Get.Config.DeploymentTopologies[0].Replicas, *res.Get.Status.DeploymentTopologyStatus[0].ReadyReplicas) + log.Infof("Deployment details: Health status - %v, Replicas - %v, Ready replicas - %v", *res.Get.Status.Health, *res.Get.Config.DataServiceDeploymentTopologies[0].Instances, *res.Get.Status.DataServiceDeploymentTopologyStatus[0].ReadyInstances) return false, nil }) diff --git a/drivers/unifiedPlatform/platform/backend/v1/api/templates.go b/drivers/unifiedPlatform/platform/backend/v1/api/templates.go index fb551c602..87cccc348 100644 --- a/drivers/unifiedPlatform/platform/backend/v1/api/templates.go +++ b/drivers/unifiedPlatform/platform/backend/v1/api/templates.go @@ -84,17 +84,19 @@ func (template *PLATFORM_API_V1) UpdateTemplates(templateReq *PlatformTemplatesR return nil, fmt.Errorf("Error in getting context for backend call: %v\n", err) } templateResponse := PlatformTemplatesResponse{} - tempValueBody := templatesv1.V1Template{ - Meta: &templatesv1.V1Meta{Name: templateReq.Create.Template.Meta.Name}, - Config: &templatesv1.V1Config{ - Kind: templateReq.Create.Template.Config.Kind, - SemanticVersion: templateReq.Create.Template.Config.SemanticVersion, - RevisionUid: templateReq.Create.Template.Config.RevisionUid, - TemplateValues: templateReq.Create.Template.Config.TemplateValues, + tempValueBody := templatesv1.TemplateServiceUpdateTemplateBody{ + Template: &templatesv1.DesiredTemplateConfiguration{ + Meta: &templatesv1.MetadataOfTheResource{Name: templateReq.Create.Template.Meta.Name}, + Config: &templatesv1.V1Config{ + Kind: templateReq.Create.Template.Config.Kind, + SemanticVersion: templateReq.Create.Template.Config.SemanticVersion, + RevisionUid: templateReq.Create.Template.Config.RevisionUid, + TemplateValues: templateReq.Create.Template.Config.TemplateValues, + }, }, } templateUpdateRequest := client.TemplateServiceUpdateTemplate(ctx, templateReq.Update.Id) - templateUpdateRequest = templateUpdateRequest.V1Template(tempValueBody) + templateUpdateRequest = templateUpdateRequest.TemplateServiceUpdateTemplateBody(tempValueBody) templateModel, res, err := templateUpdateRequest.Execute() if err != nil || res.StatusCode != status.StatusOK { return nil, fmt.Errorf("Error when calling `TemplateServiceUpdateTemplateExecute`: %v\n.Full HTTP response: %v", err, res) diff --git a/drivers/unifiedPlatform/platform/backend/v1/grpc/templates.go b/drivers/unifiedPlatform/platform/backend/v1/grpc/templates.go index 338c649f3..adfe4ba62 100644 --- a/drivers/unifiedPlatform/platform/backend/v1/grpc/templates.go +++ b/drivers/unifiedPlatform/platform/backend/v1/grpc/templates.go @@ -88,7 +88,7 @@ func (templateGrpc *PlatformGrpc) UpdateTemplates(templateReq *PlatformTemplates } tempval := structpb.Struct{} updateTemplateReq := publictemplateapis.UpdateTemplateRequest{ - Id: templateReq.Update.Id, + //Id: templateReq.Update.Id, Template: &publictemplateapis.Template{ Meta: &commonapiv1.Meta{Name: *templateReq.Create.Template.Meta.Name}, Config: &publictemplateapis.Config{ diff --git a/drivers/unifiedPlatform/resiliency/utils.go b/drivers/unifiedPlatform/resiliency/utils.go index 1fb8ed1e1..16841bc72 100644 --- a/drivers/unifiedPlatform/resiliency/utils.go +++ b/drivers/unifiedPlatform/resiliency/utils.go @@ -648,9 +648,9 @@ func ResizeDataServiceStorage(deployment *automationModels.V1Deployment, ds dsli log.Debugf("Starting to resize the storage and UpdateDeploymentResourceConfig") //Get required Id's - stConfigId := *deployment.Config.DeploymentTopologies[0].StorageOptions.Id - appConfigId := *deployment.Config.DeploymentTopologies[0].ServiceConfigurations.Id - oldResConfigId := *deployment.Config.DeploymentTopologies[0].ResourceSettings.Id + stConfigId := *deployment.Config.DataServiceDeploymentTopologies[0].StorageOptions.Id + appConfigId := *deployment.Config.DataServiceDeploymentTopologies[0].ServiceConfigurations.Id + oldResConfigId := *deployment.Config.DataServiceDeploymentTopologies[0].ResourceSettings.Id projectId := *deployment.Config.References.ProjectId imageId := *deployment.Config.References.ImageId deploymentId := *deployment.Meta.Uid @@ -709,7 +709,7 @@ func ResizeDataServiceStorage(deployment *automationModels.V1Deployment, ds dsli return false, err } - newResourceTemp, err := dslibs.GetResourceTemplateConfigs(*UpdatedDeployment.Get.Config.DeploymentTopologies[0].ResourceSettings.Id) + newResourceTemp, err := dslibs.GetResourceTemplateConfigs(*UpdatedDeployment.Get.Config.DataServiceDeploymentTopologies[0].ResourceSettings.Id) if err != nil { if ResiliencyFlag { ResiliencyCondition <- false diff --git a/drivers/unifiedPlatform/stworkflows/pds/workflowDataservice.go b/drivers/unifiedPlatform/stworkflows/pds/workflowDataservice.go index 8056ddd36..5052b1076 100644 --- a/drivers/unifiedPlatform/stworkflows/pds/workflowDataservice.go +++ b/drivers/unifiedPlatform/stworkflows/pds/workflowDataservice.go @@ -146,7 +146,7 @@ func (wfDataService *WorkflowDataService) UpdateDataService(ds dslibs.PDSDataSer return nil, err } - err = wfDataService.ValidatePdsDataServiceDeployments(*deployment.Update.Config.DeploymentMeta.Uid, ds, ds.ScaleReplicas, resConfigId, stConfigId, namespaceName, version, image) + err = wfDataService.ValidatePdsDataServiceDeployments(*deployment.Update.Config.DataServiceDeploymentMeta.Uid, ds, ds.ScaleReplicas, resConfigId, stConfigId, namespaceName, version, image) if err != nil { return nil, err } @@ -210,13 +210,13 @@ func (wfDataService *WorkflowDataService) GetDsDeploymentResources(deploymentId return resourceTemp, storageOp, dbConfig, err } - log.Debugf("Resource Template Id After Update [%s]", *deployment.Get.Config.DeploymentTopologies[0].ResourceSettings.Id) - resourceTemp, err = dslibs.GetResourceTemplateConfigs(*deployment.Get.Config.DeploymentTopologies[0].ResourceSettings.Id) + log.Debugf("Resource Template Id After Update [%s]", *deployment.Get.Config.DataServiceDeploymentTopologies[0].ResourceSettings.Id) + resourceTemp, err = dslibs.GetResourceTemplateConfigs(*deployment.Get.Config.DataServiceDeploymentTopologies[0].ResourceSettings.Id) if err != nil { return resourceTemp, storageOp, dbConfig, err } - storageOp, err = dslibs.GetStorageTemplateConfigs(*deployment.Get.Config.DeploymentTopologies[0].StorageOptions.Id) + storageOp, err = dslibs.GetStorageTemplateConfigs(*deployment.Get.Config.DataServiceDeploymentTopologies[0].StorageOptions.Id) if err != nil { return resourceTemp, storageOp, dbConfig, err } diff --git a/drivers/unifiedPlatform/stworkflows/pds/workflowRestore.go b/drivers/unifiedPlatform/stworkflows/pds/workflowRestore.go index 6735071f2..6b85ef395 100644 --- a/drivers/unifiedPlatform/stworkflows/pds/workflowRestore.go +++ b/drivers/unifiedPlatform/stworkflows/pds/workflowRestore.go @@ -18,7 +18,7 @@ type WorkflowPDSRestore struct { Validatation map[string]bool Restores map[string]automationModels.PDSRestore RestoredDeployments *WorkflowDataService - SourceDeploymentConfigBeforeUpgrade *automationModels.DeploymentTopology + SourceDeploymentConfigBeforeUpgrade *automationModels.V1DataServiceDeploymentTopology SkipValidation map[string]bool WorkflowBackup *WorkflowPDSBackup } @@ -83,13 +83,13 @@ func (restore WorkflowPDSRestore) CreateRestore(name string, backupUid string, n } restore.Restores[name] = createRestore.Create - deployment, err := pdslibs.GetDeployment(createRestore.Create.Config.DestinationReferences.DeploymentId) + deployment, err := pdslibs.GetDeployment(createRestore.Create.Config.DestinationReferences.DataServiceDeploymentId) if err != nil { return nil, err } // TODO: The Get MD5Hash needs to be run here to get the Md5CheckSum - restore.RestoredDeployments.DataServiceDeployment[createRestore.Create.Config.DestinationReferences.DeploymentId] = &pdslibs.DataServiceDetails{ + restore.RestoredDeployments.DataServiceDeployment[createRestore.Create.Config.DestinationReferences.DataServiceDeploymentId] = &pdslibs.DataServiceDetails{ Deployment: deployment.Get, Namespace: namespace, NamespaceId: restore.Destination.Namespaces[namespace], @@ -99,12 +99,12 @@ func (restore WorkflowPDSRestore) CreateRestore(name string, backupUid string, n log.Infof("Validating data after restore") if value, ok := restore.SkipValidation[CheckDataAfterRestore]; ok || - slices.Contains(stworkflows.SKIPDATASERVICEFROMWORKLOAD, restore.RestoredDeployments.DataServiceDeployment[createRestore.Create.Config.DestinationReferences.DeploymentId].DSParams.Name) { + slices.Contains(stworkflows.SKIPDATASERVICEFROMWORKLOAD, restore.RestoredDeployments.DataServiceDeployment[createRestore.Create.Config.DestinationReferences.DataServiceDeploymentId].DSParams.Name) { if value == true { log.Infof("Skipping data validation for the restore [%s]", name) } } else { - err := restore.ValidateDataAfterRestore(createRestore.Create.Config.DestinationReferences.DeploymentId, backupUid, namespace) + err := restore.ValidateDataAfterRestore(createRestore.Create.Config.DestinationReferences.DataServiceDeploymentId, backupUid, namespace) if err != nil { return nil, fmt.Errorf("data validation failed. Error - [%s]", err.Error()) } diff --git a/drivers/unifiedPlatform/stworkflows/platform/workflowTargetCluster.go b/drivers/unifiedPlatform/stworkflows/platform/workflowTargetCluster.go index 9479f727a..b5d90b3ca 100644 --- a/drivers/unifiedPlatform/stworkflows/platform/workflowTargetCluster.go +++ b/drivers/unifiedPlatform/stworkflows/platform/workflowTargetCluster.go @@ -78,6 +78,7 @@ func (targetCluster *WorkflowTargetCluster) RegisterToControlPlane() (*WorkflowT cmd = fmt.Sprintf("echo '%s' > %s && kubectl apply -f %s && rm -f %s", *manifest.Manifest, ManifestPath, ManifestPath, ManifestPath) log.Infof("Manifest:\n%v\n", cmd) output, _, err := osutils.ExecShell(cmd) + log.Infof("Output: %v", output) if err != nil { return targetCluster, fmt.Errorf("Error occured shile installing manifests: %v\n", err) } diff --git a/drivers/unifiedPlatform/unifiedPlatform.go b/drivers/unifiedPlatform/unifiedPlatform.go index 4d818a941..bc2f15f87 100644 --- a/drivers/unifiedPlatform/unifiedPlatform.go +++ b/drivers/unifiedPlatform/unifiedPlatform.go @@ -14,8 +14,8 @@ import ( backupV1 "github.com/pure-px/platform-api-go-client/pds/v1/backup" backupConfigV1 "github.com/pure-px/platform-api-go-client/pds/v1/backupconfig" catalogV1 "github.com/pure-px/platform-api-go-client/pds/v1/catalog" - deploymentV1 "github.com/pure-px/platform-api-go-client/pds/v1/deployment" - deploymentsConfigUpdateV1 "github.com/pure-px/platform-api-go-client/pds/v1/deploymentconfigupdate" + deploymentV1 "github.com/pure-px/platform-api-go-client/pds/v1/dataservicedeployment" + deploymentsConfigUpdateV1 "github.com/pure-px/platform-api-go-client/pds/v1/dataservicedeploymentconfigupdate" restoreV1 "github.com/pure-px/platform-api-go-client/pds/v1/restore" accountv1 "github.com/pure-px/platform-api-go-client/platform/v1/account" backuplocationv1 "github.com/pure-px/platform-api-go-client/platform/v1/backuplocation" diff --git a/drivers/utilities/utilities.go b/drivers/utilities/utilities.go index 7ae0c2f29..e34a87d78 100644 --- a/drivers/utilities/utilities.go +++ b/drivers/utilities/utilities.go @@ -501,13 +501,13 @@ func ParseInterfaceAndGetDetails(connectionDetails interface{}, dataServiceName return "", fmt.Errorf("Error: connectionDetails is not of type map[string]interface{}") } - nodesInterface, ok := connDetailsMap["nodes"] + nodesInterface, ok := connDetailsMap["instances"] if !ok { - return "", fmt.Errorf("Error: nodes not found in connectionDetails") + return "", fmt.Errorf("Error: instances not found in connectionDetails") } nodes, ok := nodesInterface.([]interface{}) if !ok { - return "", fmt.Errorf("Error: nodes is not of type []interface{}") + return "", fmt.Errorf("Error: instances is not of type []interface{}") } log.Debugf("Available nodes") diff --git a/drivers/volume/aws/aws.go b/drivers/volume/aws/aws.go index 091844622..a7333913c 100644 --- a/drivers/volume/aws/aws.go +++ b/drivers/volume/aws/aws.go @@ -2,10 +2,14 @@ package aws import ( "fmt" + "github.com/libopenstorage/openstorage/api" + "github.com/portworx/torpedo/drivers/node" + "github.com/portworx/torpedo/drivers/volume" torpedovolume "github.com/portworx/torpedo/drivers/volume" "github.com/portworx/torpedo/drivers/volume/portworx/schedops" + "github.com/portworx/torpedo/pkg/errors" "github.com/portworx/torpedo/pkg/log" ) @@ -54,6 +58,24 @@ func (i *aws) DeleteSnapshotsForVolumes(volumeNames []string, clusterProviderCre return nil } +// UpdateFBDANFSEndpoint updates the NFS endpoint for a given FBDA volume +func (d *aws) UpdateFBDANFSEndpoint(volumeName string, newEndpoint string) error { + log.Warnf("UpdateFBDANFSEndpoint function has not been implemented for volume driver - %s", d.String()) + return &errors.ErrNotSupported{ + Type: "Function", + Operation: "UpdateFBDANFSEndpoint()", + } +} + +// ValidatePureFBDAMountSource checks that, on all the given nodes, all the provided FBDA volumes are mounted using the expected IP +func (d *aws) ValidatePureFBDAMountSource(nodes []node.Node, vols []*volume.Volume, expectedIP string) error { + log.Warnf("ValidatePureFBDAMountSource function has not been implemented for volume driver - %s", d.String()) + return &errors.ErrNotSupported{ + Type: "Function", + Operation: "ValidatePureFBDAMountSource()", + } +} + func (d *aws) Init(sched, nodeDriver, token, storageProvisioner, csiGenericDriverConfigMap string) error { log.Infof("Using the AWS EBS volume driver with provisioner %s under scheduler: %v", storageProvisioner, sched) torpedovolume.StorageDriver = DriverName diff --git a/drivers/volume/azure/azure.go b/drivers/volume/azure/azure.go index 388b4d32c..07e5bd311 100644 --- a/drivers/volume/azure/azure.go +++ b/drivers/volume/azure/azure.go @@ -5,6 +5,8 @@ import ( "github.com/libopenstorage/openstorage/api" + "github.com/portworx/torpedo/drivers/node" + "github.com/portworx/torpedo/drivers/volume" torpedovolume "github.com/portworx/torpedo/drivers/volume" "github.com/portworx/torpedo/drivers/volume/portworx/schedops" "github.com/portworx/torpedo/pkg/errors" @@ -92,6 +94,24 @@ func (d *azure) DeleteSnapshotsForVolumes(volumeNames []string, clusterProviderC return nil } +// UpdateFBDANFSEndpoint updates the NFS endpoint for a given FBDA volume +func (d *azure) UpdateFBDANFSEndpoint(volumeName string, newEndpoint string) error { + log.Warnf("UpdateFBDANFSEndpoint function has not been implemented for volume driver - %s", d.String()) + return &errors.ErrNotSupported{ + Type: "Function", + Operation: "UpdateFBDANFSEndpoint()", + } +} + +// ValidatePureFBDAMountSource checks that, on all the given nodes, all the provided FBDA volumes are mounted using the expected IP +func (d *azure) ValidatePureFBDAMountSource(nodes []node.Node, vols []*volume.Volume, expectedIP string) error { + log.Warnf("ValidatePureFBDAMountSource function has not been implemented for volume driver - %s", d.String()) + return &errors.ErrNotSupported{ + Type: "Function", + Operation: "ValidatePureFBDAMountSource()", + } +} + func (d *azure) Init(sched, nodeDriver, token, storageProvisioner, csiGenericDriverConfigMap string) error { log.Infof("Using the Azure volume driver with provisioner %s under scheduler: %v", storageProvisioner, sched) torpedovolume.StorageDriver = DriverName diff --git a/drivers/volume/common.go b/drivers/volume/common.go index fe38a8959..8d749e9b6 100644 --- a/drivers/volume/common.go +++ b/drivers/volume/common.go @@ -361,6 +361,15 @@ func (d *DefaultDriver) GetCloudsnaps(name string, params map[string]string) ([] } } +// GetCloudsnapsOfGivenVolume returns cloudsnap backups of given volume. +// params are the custom volume options passed when creating the volume. +func (d *DefaultDriver) GetCloudsnapsOfGivenVolume(name string, volumeID string, params map[string]string) ([]*api.SdkCloudBackupInfo, error) { + return nil, &errors.ErrNotSupported{ + Type: "Function", + Operation: "GetCloudsnapsOfGivenVolume()", + } +} + // DeleteAllCloudsnaps deletes all cloudsnap backups // params are the custom volume options passed when creating the volume. func (d *DefaultDriver) DeleteAllCloudsnaps(name, sourceVolumeID string, params map[string]string) error { @@ -1210,3 +1219,19 @@ func (d *DefaultDriver) GetPxctlStatus(n node.Node) (string, error) { func (d *DefaultDriver) IsPxReadyOnNode(n node.Node) bool { return false } + +// EnableSkinnySnap Enables skinnysnap on the cluster +func (d *DefaultDriver) EnableSkinnySnap() error { + return &errors.ErrNotSupported{ + Type: "Function", + Operation: "EnableSkinnySnap()", + } +} + +// UpdateSkinnySnapReplNum update skinnysnap Repl factor +func (d *DefaultDriver) UpdateSkinnySnapReplNum(repl string) error { + return &errors.ErrNotSupported{ + Type: "Function", + Operation: "UpdateSkinnySnapReplNum()", + } +} diff --git a/drivers/volume/gce/gce.go b/drivers/volume/gce/gce.go index 870464936..7de2e2056 100644 --- a/drivers/volume/gce/gce.go +++ b/drivers/volume/gce/gce.go @@ -2,10 +2,13 @@ package gce import ( "fmt" + "github.com/libopenstorage/openstorage/api" "github.com/portworx/torpedo/pkg/log" + "github.com/portworx/torpedo/drivers/node" + "github.com/portworx/torpedo/drivers/volume" torpedovolume "github.com/portworx/torpedo/drivers/volume" "github.com/portworx/torpedo/drivers/volume/portworx/schedops" "github.com/portworx/torpedo/pkg/errors" @@ -106,6 +109,24 @@ func (d *gce) DeleteSnapshotsForVolumes(volumeNames []string, clusterProviderCre return nil } +// UpdateFBDANFSEndpoint updates the NFS endpoint for a given FBDA volume +func (d *gce) UpdateFBDANFSEndpoint(volumeName string, newEndpoint string) error { + log.Warnf("UpdateFBDANFSEndpoint function has not been implemented for volume driver - %s", d.String()) + return &errors.ErrNotSupported{ + Type: "Function", + Operation: "UpdateFBDANFSEndpoint()", + } +} + +// ValidatePureFBDAMountSource checks that, on all the given nodes, all the provided FBDA volumes are mounted using the expected IP +func (d *gce) ValidatePureFBDAMountSource(nodes []node.Node, vols []*volume.Volume, expectedIP string) error { + log.Warnf("ValidatePureFBDAMountSource function has not been implemented for volume driver - %s", d.String()) + return &errors.ErrNotSupported{ + Type: "Function", + Operation: "ValidatePureFBDAMountSource()", + } +} + func init() { torpedovolume.Register(DriverName, provisioners, &gce{}) } diff --git a/drivers/volume/generic_csi/generic_csi.go b/drivers/volume/generic_csi/generic_csi.go index e47128a8c..2eb511e42 100644 --- a/drivers/volume/generic_csi/generic_csi.go +++ b/drivers/volume/generic_csi/generic_csi.go @@ -2,11 +2,15 @@ package csi import ( "fmt" + "github.com/libopenstorage/openstorage/api" "github.com/portworx/sched-ops/k8s/core" + "github.com/portworx/torpedo/drivers/node" + "github.com/portworx/torpedo/drivers/volume" torpedovolume "github.com/portworx/torpedo/drivers/volume" "github.com/portworx/torpedo/drivers/volume/portworx/schedops" + "github.com/portworx/torpedo/pkg/errors" "github.com/portworx/torpedo/pkg/log" ) @@ -76,6 +80,24 @@ func (d *genericCsi) DeleteSnapshotsForVolumes(volumeNames []string, clusterProv return nil } +// UpdateFBDANFSEndpoint updates the NFS endpoint for a given FBDA volume +func (d *genericCsi) UpdateFBDANFSEndpoint(volumeName string, newEndpoint string) error { + log.Warnf("UpdateFBDANFSEndpoint function has not been implemented for volume driver - %s", d.String()) + return &errors.ErrNotSupported{ + Type: "Function", + Operation: "UpdateFBDANFSEndpoint()", + } +} + +// ValidatePureFBDAMountSource checks that, on all the given nodes, all the provided FBDA volumes are mounted using the expected IP +func (d *genericCsi) ValidatePureFBDAMountSource(nodes []node.Node, vols []*volume.Volume, expectedIP string) error { + log.Warnf("ValidatePureFBDAMountSource function has not been implemented for volume driver - %s", d.String()) + return &errors.ErrNotSupported{ + Type: "Function", + Operation: "ValidatePureFBDAMountSource()", + } +} + func init() { torpedovolume.Register(DriverName, provisioners, &genericCsi{}) } diff --git a/drivers/volume/ibm/ibm.go b/drivers/volume/ibm/ibm.go index 377ff4831..c6666f6c6 100644 --- a/drivers/volume/ibm/ibm.go +++ b/drivers/volume/ibm/ibm.go @@ -2,9 +2,12 @@ package ibm import ( "fmt" + ibmcore "github.com/IBM/go-sdk-core/v5/core" "github.com/IBM/vpc-go-sdk/vpcv1" "github.com/libopenstorage/openstorage/api" + "github.com/portworx/torpedo/drivers/node" + "github.com/portworx/torpedo/drivers/volume" torpedovolume "github.com/portworx/torpedo/drivers/volume" "github.com/portworx/torpedo/drivers/volume/portworx" "github.com/portworx/torpedo/drivers/volume/portworx/schedops" @@ -98,6 +101,24 @@ func (i *ibm) InspectVolume(name string) (*api.Volume, error) { } } +// UpdateFBDANFSEndpoint updates the NFS endpoint for a given FBDA volume +func (i *ibm) UpdateFBDANFSEndpoint(volumeName string, newEndpoint string) error { + log.Warnf("UpdateFBDANFSEndpoint function has not been implemented for volume driver - %s", i.String()) + return &errors.ErrNotSupported{ + Type: "Function", + Operation: "UpdateFBDANFSEndpoint()", + } +} + +// ValidatePureFBDAMountSource checks that, on all the given nodes, all the provided FBDA volumes are mounted using the expected IP +func (i *ibm) ValidatePureFBDAMountSource(nodes []node.Node, vols []*volume.Volume, expectedIP string) error { + log.Warnf("ValidatePureFBDAMountSource function has not been implemented for volume driver - %s", i.String()) + return &errors.ErrNotSupported{ + Type: "Function", + Operation: "ValidatePureFBDAMountSource()", + } +} + // DeleteSnapshotsForVolumes deletes snapshots for the specified volumes in ibm cloud func (i *ibm) DeleteSnapshotsForVolumes(volumeNames []string, apiKey string) error { diff --git a/drivers/volume/linstor/linstor.go b/drivers/volume/linstor/linstor.go index 5551ae53d..ce64aa843 100644 --- a/drivers/volume/linstor/linstor.go +++ b/drivers/volume/linstor/linstor.go @@ -3,16 +3,19 @@ package linstor import ( "context" "fmt" - "github.com/libopenstorage/openstorage/api" "time" + "github.com/libopenstorage/openstorage/api" + lclient "github.com/LINBIT/golinstor/client" "github.com/portworx/sched-ops/k8s/core" "github.com/portworx/sched-ops/task" driver_api "github.com/portworx/torpedo/drivers/api" "github.com/portworx/torpedo/drivers/node" + "github.com/portworx/torpedo/drivers/volume" torpedovolume "github.com/portworx/torpedo/drivers/volume" "github.com/portworx/torpedo/drivers/volume/portworx/schedops" + "github.com/portworx/torpedo/pkg/errors" "github.com/portworx/torpedo/pkg/log" ) @@ -144,6 +147,24 @@ func (d *linstor) DeleteSnapshotsForVolumes(volumeNames []string, clusterProvide return nil } +// UpdateFBDANFSEndpoint updates the NFS endpoint for a given FBDA volume +func (d *linstor) UpdateFBDANFSEndpoint(volumeName string, newEndpoint string) error { + log.Warnf("UpdateFBDANFSEndpoint function has not been implemented for volume driver - %s", d.String()) + return &errors.ErrNotSupported{ + Type: "Function", + Operation: "UpdateFBDANFSEndpoint()", + } +} + +// ValidatePureFBDAMountSource checks that, on all the given nodes, all the provided FBDA volumes are mounted using the expected IP +func (d *linstor) ValidatePureFBDAMountSource(nodes []node.Node, vols []*volume.Volume, expectedIP string) error { + log.Warnf("ValidatePureFBDAMountSource function has not been implemented for volume driver - %s", d.String()) + return &errors.ErrNotSupported{ + Type: "Function", + Operation: "ValidatePureFBDAMountSource()", + } +} + func init() { torpedovolume.Register(DriverName, provisioners, &linstor{}) } diff --git a/drivers/volume/ocp/ocp.go b/drivers/volume/ocp/ocp.go index 14cf92d82..9e355be09 100644 --- a/drivers/volume/ocp/ocp.go +++ b/drivers/volume/ocp/ocp.go @@ -2,7 +2,10 @@ package ocp import ( "fmt" + "github.com/libopenstorage/openstorage/api" + "github.com/portworx/torpedo/drivers/node" + "github.com/portworx/torpedo/drivers/volume" torpedovolume "github.com/portworx/torpedo/drivers/volume" "github.com/portworx/torpedo/drivers/volume/portworx" "github.com/portworx/torpedo/drivers/volume/portworx/schedops" @@ -101,6 +104,24 @@ func (o *ocp) InspectVolume(name string) (*api.Volume, error) { } } +// UpdateFBDANFSEndpoint updates the NFS endpoint for a given FBDA volume +func (o *ocp) UpdateFBDANFSEndpoint(volumeName string, newEndpoint string) error { + log.Warnf("UpdateFBDANFSEndpoint function has not been implemented for volume driver - %s", o.String()) + return &errors.ErrNotSupported{ + Type: "Function", + Operation: "UpdateFBDANFSEndpoint()", + } +} + +// ValidatePureFBDAMountSource checks that, on all the given nodes, all the provided FBDA volumes are mounted using the expected IP +func (o *ocp) ValidatePureFBDAMountSource(nodes []node.Node, vols []*volume.Volume, expectedIP string) error { + log.Warnf("ValidatePureFBDAMountSource function has not been implemented for volume driver - %s", o.String()) + return &errors.ErrNotSupported{ + Type: "Function", + Operation: "ValidatePureFBDAMountSource()", + } +} + // DeleteSnapshotsForVolumes deletes snapshots for the specified volumes in ocp cluster func (o *ocp) DeleteSnapshotsForVolumes(volumeNames []string, clusterProviderCredential string) error { log.Warnf("DeleteSnapshotsForVolumes function has not been implemented for volume driver - %s", o.String()) diff --git a/drivers/volume/portworx/portworx.go b/drivers/volume/portworx/portworx.go index b4163c137..c8019683b 100644 --- a/drivers/volume/portworx/portworx.go +++ b/drivers/volume/portworx/portworx.go @@ -3,6 +3,7 @@ package portworx import ( "context" "encoding/json" + "flag" "fmt" "io/ioutil" "math" @@ -90,6 +91,7 @@ const ( pxctlVolumeListFilter = "pxctl volume list -l %s=%s" pxctlVolumeUpdate = "pxctl volume update " pxctlGroupSnapshotCreate = "pxctl volume snapshot group" + pxctlClusterOptionsUpdate = "pxctl cluster options update" pxctlDriveAddStart = "%s -j service drive add %s -o start" pxctlDriveAddStatus = "%s -j service drive add %s -o status" pxctlCloudDriveInspect = "%s -j cd inspect --node %s" @@ -147,6 +149,7 @@ const ( validateStorageClusterTimeout = 40 * time.Minute expandStoragePoolTimeout = 2 * time.Minute volumeUpdateTimeout = 2 * time.Minute + skinnySnapRetryInterval = 5 * time.Second ) const ( telemetryNotEnabled = "15" @@ -487,6 +490,16 @@ func (d *portworx) Init(sched, nodeDriver, token, storageProvisioner, csiGeneric func (d *portworx) RefreshDriverEndpoints() error { + secretConfigMap := flag.Lookup("config-map").Value.(flag.Getter).Get().(string) + if secretConfigMap != "" { + log.Infof("Fetching token from configmap: %s", secretConfigMap) + token, err := d.schedOps.GetTokenFromConfigMap(secretConfigMap) + if err != nil { + return err + } + d.token = token + } + // getting namespace again (refreshing it) as namespace of portworx in switched context might have changed namespace, err := d.GetVolumeDriverNamespace() if err != nil { @@ -649,16 +662,9 @@ func (d *portworx) comparePoolsAndDisks(srcNode *api.StorageNode, srcDisks := srcNode.Disks dstDisks := dstNode.Disks - for disk, value := range srcDisks { - if !srcDisks[disk].Metadata && !dstDisks[disk].Metadata { - if value.Id != dstDisks[disk].Id { - return false - } - } else if srcDisks[disk].Metadata && dstDisks[disk].Metadata { - if value.Id != dstDisks[disk].Id { - return false - } - } + if len(srcDisks) != len(dstDisks) { + log.Errorf("Source disks: [%v] not macthing with Destination disks: [%v]", srcDisks, dstDisks) + return false } return true } @@ -1206,7 +1212,7 @@ func (d *portworx) ExitPoolMaintenance(n node.Node) error { // no need to exit pool maintenance if node status is up pxStatus, err := d.GetPxctlStatus(n) - if err == nil && pxStatus == api.Status_STATUS_OK.String(){ + if err == nil && pxStatus == api.Status_STATUS_OK.String() { log.Infof("node is up, no need to exit pool maintenance mode") return nil } @@ -1256,6 +1262,7 @@ func (d *portworx) GetNodePoolsStatus(n node.Node) (map[string]string, error) { if err != nil { return nil, fmt.Errorf("error getting pool status on node [%s], Err: %v", n.Name, err) } + log.Debugf("GetNodePoolsStatus output: %s", out) outLines := strings.Split(out, "\n") poolsData := make(map[string]string) @@ -1503,10 +1510,10 @@ func (d *portworx) ValidateCreateVolume(volumeName string, params map[string]str return errFailedToInspectVolume(volumeName, k, requestedSpec.AggregationLevel, vol.Spec.AggregationLevel) } /* Ignore shared setting. - case api.SpecShared: - if requestedSpec.Shared != vol.Spec.Shared { - return errFailedToInspectVolume(volumeName, k, requestedSpec.Shared, vol.Spec.Shared) - } + case api.SpecShared: + if requestedSpec.Shared != vol.Spec.Shared { + return errFailedToInspectVolume(volumeName, k, requestedSpec.Shared, vol.Spec.Shared) + } */ case api.SpecSticky: if requestedSpec.Sticky != vol.Spec.Sticky { @@ -1797,7 +1804,7 @@ func constructSnapshotName(volumeName string) string { return volumeName + "-snapshot" } -// GetCloudsnaps returns all the cloud snaps of the given volume +// GetCloudsnaps returns all the cloud snaps of all volumes func (d *portworx) GetCloudsnaps(volumeName string, params map[string]string) ([]*api.SdkCloudBackupInfo, error) { var token string token = d.getTokenForVolume(volumeName, params) @@ -1815,6 +1822,21 @@ func (d *portworx) GetCloudsnaps(volumeName string, params map[string]string) ([ } +// GetCloudsnaps returns all the cloud snaps of the given volume +func (d *portworx) GetCloudsnapsOfGivenVolume(volumeName string, sourceVolumeID string, params map[string]string) ([]*api.SdkCloudBackupInfo, error) { + var token string + token = d.getTokenForVolume(volumeName, params) + if val, hasKey := params[refreshEndpointParam]; hasKey { + refreshEndpoint, _ := strconv.ParseBool(val) + d.refreshEndpoint = refreshEndpoint + } + cloudSnapResponse, err := d.csbackupManager.EnumerateWithFilters(d.getContextWithToken(context.Background(), token), &api.SdkCloudBackupEnumerateWithFiltersRequest{SrcVolumeId: sourceVolumeID}) + if err != nil { + return nil, fmt.Errorf("failed to get cloudsnap, Err: %v", err) + } + return cloudSnapResponse.GetBackups(), nil +} + // DeleteAllCloudsnaps delete all cloud snaps for a given volume func (d *portworx) DeleteAllCloudsnaps(volumeName, sourceVolumeID string, params map[string]string) error { var token string @@ -1900,6 +1922,29 @@ func (d *portworx) ValidateVolumeInPxctlList(volumeName string) error { return nil } +func (d *portworx) UpdateFBDANFSEndpoint(volumeName string, newEndpoint string) error { + nodes := node.GetStorageDriverNodes() + cmd := fmt.Sprintf("%s --pure_nfs_endpoint %s %s", pxctlVolumeUpdate, newEndpoint, volumeName) + _, err := d.nodeDriver.RunCommandWithNoRetry( + nodes[0], + cmd, + node.ConnectionOpts{ + Timeout: crashDriverTimeout, + TimeBeforeRetry: defaultRetryInterval, + }) + if err != nil { + return fmt.Errorf("failed setting FBDA NFS endpoint for volume [%s] to [%s] from node [%s], Err: %v", volumeName, newEndpoint, nodes[0], err) + } + return nil +} + +func (d *portworx) ValidatePureFBDAMountSource(nodes []node.Node, vols []*torpedovolume.Volume, expectedIP string) error { + // For each node + // Run `mount` on node + // Search through lines for our volume names, check that all contain right IP + return fmt.Errorf("not implemented (ValidatePureFBDAMountSource)") +} + func (d *portworx) ValidatePureVolumesNoReplicaSets(volumeName string, params map[string]string) error { var token string token = d.getTokenForVolume(volumeName, params) @@ -2446,8 +2491,17 @@ func (d *portworx) GetNodeForVolume(vol *torpedovolume.Volume, timeout time.Dura Cause: err.Error(), } } + isPureFile, err := d.IsPureFileVolume(vol) + if err != nil { + return nil, false, err + } + if isPureFile { + return nil, false, nil + } + pxVol := volumeInspectResponse.Volume for _, n := range node.GetStorageDriverNodes() { + ok, err := d.IsVolumeAttachedOnNode(pxVol, n) if err != nil { return nil, false, err @@ -2461,7 +2515,6 @@ func (d *portworx) GetNodeForVolume(vol *torpedovolume.Volume, timeout time.Dura if pxVol.Source.Parent != "" { return nil, false, nil } - return nil, true, fmt.Errorf("volume [%s] is not attached on any node", volumeName) } @@ -2690,7 +2743,13 @@ func (d *portworx) WaitDriverUpOnNode(n node.Node, timeout time.Duration) error case api.Status_STATUS_OFFLINE: // in case node is offline and it is a storageless node, the id might have changed so update it if len(pxNode.Pools) == 0 { - d.updateNodeID(&n, d.getNodeManager()) + _, err = d.updateNodeID(&n, d.getNodeManager()) + if err != nil { + return "", true, &ErrFailedToWaitForPx{ + Node: n, + Cause: fmt.Sprintf("failed to update node id [%s/%s], Err: %v", n.Name, n.VolDriverNodeID, err), + } + } } return "", true, &ErrFailedToWaitForPx{ Node: n, @@ -2698,6 +2757,7 @@ func (d *portworx) WaitDriverUpOnNode(n node.Node, timeout time.Duration) error n.Name, n.VolDriverNodeID, api.Status_STATUS_OK, pxNode.Status), } default: + log.Infof("Status PX available %s", pxNode.Status.String()) return "", true, &ErrFailedToWaitForPx{ Node: n, Cause: fmt.Sprintf("PX cluster is usable but node [%s/%s] status is not ok. Expected: %v Actual: %v", @@ -2835,7 +2895,7 @@ func (d *portworx) ValidateRebalanceJobs() error { } func (d *portworx) ResizeStoragePoolByPercentage(poolUUID string, e api.SdkStoragePool_ResizeOperationType, percentage uint64) error { - log.InfoD("Initiating pool %v resize by %v with operationtype %v", poolUUID, percentage, e.String()) + log.InfoD("Initiating pool %v resize by %v with operation-type %v", poolUUID, percentage, e.String()) // Start a task to check if pool resize is done t := func() (interface{}, bool, error) { @@ -4357,9 +4417,9 @@ func (d *portworx) updateNodeID(n *node.Node, nManager ...api.OpenStorageNodeCli return n, err } if err = d.updateNode(n, nodes); err != nil { - return &node.Node{}, fmt.Errorf("failed to update node ID for node [%s], Err: %v", n.Name, err) + return &node.Node{}, fmt.Errorf("failed to update node ID for node [%s] with ID [%s] in the cluster, Err: %v", n.Name, n.Id, err) } - return n, fmt.Errorf("failed to find node [%s] with ID [%s] in the cluster", n.Name, n.Id) + return n, nil } func getGroupMatches(groupRegex *regexp.Regexp, str string) map[string]string { @@ -5224,7 +5284,8 @@ func (d *portworx) ValidateDriver(endpointVersion string, autoUpdateComponents b } // Validate StorageCluster - if err = optest.ValidateStorageCluster(imageList, newStc, validateStorageClusterTimeout, defaultRetryInterval, true); err != nil { + storageClusterValidateTimeout := time.Duration(len(node.GetStorageDriverNodes())*9) * time.Minute + if err = optest.ValidateStorageCluster(imageList, newStc, storageClusterValidateTimeout, defaultRetryInterval, true); err != nil { return err } } @@ -5268,8 +5329,8 @@ func (d *portworx) updateAndValidateStorageCluster(cluster *v1.StorageCluster, f } } } - - if err = optest.ValidateStorageCluster(imageList, stc, validateStorageClusterTimeout, defaultRetryInterval, true); err != nil { + storageClusterValidateTimeout := time.Duration(len(node.GetStorageDriverNodes())*9) * time.Minute + if err = optest.ValidateStorageCluster(imageList, stc, storageClusterValidateTimeout, defaultRetryInterval, true); err != nil { return nil, err } return stc, nil @@ -6185,3 +6246,41 @@ func (d *portworx) GetAlertsUsingResourceTypeByTime(resourceType api.ResourceTyp func (d *portworx) IsPxReadyOnNode(n node.Node) bool { return d.schedOps.IsPXReadyOnNode(n) } + +// EnableSkinnySnap Enables skinnysnap on the cluster +func (d *portworx) EnableSkinnySnap() error { + for _, eachNode := range node.GetNodes() { + cmd := fmt.Sprintf("echo Y | %s --skinnysnap on", pxctlClusterOptionsUpdate) + _, err := d.nodeDriver.RunCommandWithNoRetry( + eachNode, + cmd, + node.ConnectionOpts{ + Timeout: skinnySnapRetryInterval, + TimeBeforeRetry: defaultRetryInterval, + }) + if err != nil { + return fmt.Errorf("Failed to enable skinny Snap on Cluster, Err: %v", err) + } + break + } + return nil +} + +// UpdateSkinnySnapReplNum update skinnysnap Repl factor +func (d *portworx) UpdateSkinnySnapReplNum(repl string) error { + for _, eachNode := range node.GetNodes() { + cmd := fmt.Sprintf("echo Y | %s --skinnysnap-num-repls %s", pxctlClusterOptionsUpdate, repl) + _, err := d.nodeDriver.RunCommandWithNoRetry( + eachNode, + cmd, + node.ConnectionOpts{ + Timeout: skinnySnapRetryInterval, + TimeBeforeRetry: defaultRetryInterval, + }) + if err != nil { + return fmt.Errorf("failed to Update SkinnySnap Repl Factor, Err: %v", err) + } + break + } + return nil +} \ No newline at end of file diff --git a/drivers/volume/portworx/schedops/anthos-schedops.go b/drivers/volume/portworx/schedops/anthos-schedops.go new file mode 100644 index 000000000..e47e8111b --- /dev/null +++ b/drivers/volume/portworx/schedops/anthos-schedops.go @@ -0,0 +1,12 @@ +package schedops + +// This is a subclass of k8sSchedOps +// This is needed to differentiate k8s and anthos scheduler +type anthosSchedOps struct { + k8sSchedOps +} + +func init() { + k := &anthosSchedOps{} + Register("anthos", k) +} diff --git a/drivers/volume/portworx/schedops/dcos-schedops.go b/drivers/volume/portworx/schedops/dcos-schedops.go index df7821dd3..5d7cfc48b 100644 --- a/drivers/volume/portworx/schedops/dcos-schedops.go +++ b/drivers/volume/portworx/schedops/dcos-schedops.go @@ -12,6 +12,10 @@ import ( type dcosSchedOps struct { } +func (d *dcosSchedOps) GetTokenFromConfigMap(configMapName string) (string, error) { + return "", nil +} + func (d *dcosSchedOps) GetKubernetesVersion() (*version.Info, error) { return nil, nil } diff --git a/drivers/volume/portworx/schedops/k8s-schedops.go b/drivers/volume/portworx/schedops/k8s-schedops.go index 30ddfee4a..192a511c2 100644 --- a/drivers/volume/portworx/schedops/k8s-schedops.go +++ b/drivers/volume/portworx/schedops/k8s-schedops.go @@ -65,6 +65,8 @@ const ( k8sRoleNodeInfraLabelKey = "node-role.kubernetes.io/infra" // k8sRoleNodeComputeLabelKey is the label used to check whether node has compute=true label on OpenShift Enterprise environment k8sRoleNodeComputeLabelKey = "node-role.kubernetes.io/compute" + secretNameKey = "secret_name" + secretNamespaceKey = "secret_namespace" // nodeType is label used to check kubernetes node-type dcosNodeType = "kubernetes.dcos.io/node-type" @@ -239,10 +241,12 @@ func (k *k8sSchedOps) ValidateVolumeSetup(vol *volume.Volume, d node.Driver) err t := func() (interface{}, bool, error) { pods, err := k8sCore.GetPodsUsingPV(pvName) - printStatus(k, pods...) if err != nil { return nil, true, err } + log.Infof("Found %d pods using PV [%s]", len(pods), pvName) + printStatus(k, pods...) + log.Infof("Validating volume setup for volume [%s]", vol.Name) resp := make([]string, 0) if vol.Raw { @@ -292,11 +296,8 @@ func (k *k8sSchedOps) ValidateVolumeSetup(vol *volume.Volume, d node.Driver) err return nil, true, fmt.Errorf("pods pending validation current: %d. Expected: %d", lenValidatedPods, lenExpectedPods) } - if _, err := task.DoRetryWithTimeout(t, defaultTimeout, defaultRetryInterval); err != nil { - return err - } - - return nil + _, err := task.DoRetryWithTimeout(t, 30*time.Minute, defaultRetryInterval) + return err } func (k *k8sSchedOps) validateDevicesInPods( @@ -361,6 +362,7 @@ func (k *k8sSchedOps) validateMountsInPods( validatedMountPods := make([]string, 0) nodes := node.GetNodesByName() + isNvme := false PodLoop: for _, p := range pods { pod, err := k8sCore.GetPodByName(p.Name, p.Namespace) @@ -415,10 +417,15 @@ PodLoop: } log.Infof("Pod [%s/%s] container [%s] and paths [%v] after checking sym links", p.Namespace, p.Name, containerName, paths) for _, path := range paths { - pxMountCheckRegex := regexp.MustCompile(fmt.Sprintf("^(/dev/pxd.+|pxfs.+|/dev/mapper/pxd-enc.+|%s.+|/dev/loop.+|\\d+\\.\\d+\\.\\d+\\.\\d+:/var/lib/osd/pxns.+|(.[A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}]:/var/lib/osd/pxns.+|\\d+.\\d+.\\d+.\\d+:/px_[0-9A-Za-z]{8}-pvc.+) %s", PureMapperRegex, path)) + pxMountCheckRegex := regexp.MustCompile(fmt.Sprintf("^(/dev/pxd.+|pxfs.+|/dev/mapper/pxd-enc.+|%s.+|/dev/loop.+|\\d+\\.\\d+\\.\\d+\\.\\d+:/var/lib/osd/pxns.+|(.[A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}]:/var/lib/osd/pxns.+|\\d+.\\d+.\\d+.\\d+:/px_[0-9A-Za-z]{8}-pvc.+) %s", + PureMapperRegex, path)) + pxMountNvmeRegex := regexp.MustCompile(`\/dev\/mapper\/eui\.00.*24a937.*`) pxMountFound := false for _, line := range mounts { pxMounts := pxMountCheckRegex.FindStringSubmatch(line) + if pxMountNvmeRegex.MatchString(line) { + isNvme = true + } if len(pxMounts) > 0 { log.Debugf("Pod [%s/%s] container [%s] has PX mount: %v", pod.Namespace, pod.Name, containerName, pxMounts) @@ -459,6 +466,9 @@ PodLoop: grepPattern := pvName // For normal PX vols, and for FBDA, we can grep for the filesystem name if pureType, ok := vol.Labels[k8sdriver.PureDAVolumeLabel]; ok && pureType == k8sdriver.PureDAVolumeLabelValueFA { grepPattern = strings.ToLower(vol.Labels[k8sdriver.FADAVolumeSerialLabel]) // FADA we need to grep by volume serial + if isNvme { + grepPattern = fmt.Sprintf("%s | grep %s", grepPattern[:14], grepPattern[14:]) + } } log.Debugf("Executing command [%s] on node [%s]", fmt.Sprintf("cat /proc/mounts | grep -E '(pxd|pxfs|pxns|pxd-enc|loop|px_|/dev/mapper)' | grep %s", grepPattern), currentNode.Name) volMount, _ := d.RunCommand(currentNode, @@ -1074,6 +1084,22 @@ func (k *k8sSchedOps) GetPortworxNamespace() (string, error) { } +func (k *k8sSchedOps) GetTokenFromConfigMap(configMapName string) (string, error) { + var token string + var err error + var configMap *corev1.ConfigMap + k8sOps := k8sCore + if configMap, err = k8sOps.GetConfigMap(configMapName, "default"); err == nil { + if secret, err := k8sOps.GetSecret(configMap.Data[secretNameKey], configMap.Data[secretNamespaceKey]); err == nil { + if tk, ok := secret.Data["auth-token"]; ok { + token = string(tk) + } + } + } + log.Infof("Token from secret: %s", token) + return token, err +} + func printStatus(k *k8sSchedOps, pods ...corev1.Pod) { for _, pod := range pods { status := "" diff --git a/drivers/volume/portworx/schedops/schedops.go b/drivers/volume/portworx/schedops/schedops.go index 050ad6d41..7d95b77b1 100644 --- a/drivers/volume/portworx/schedops/schedops.go +++ b/drivers/volume/portworx/schedops/schedops.go @@ -38,6 +38,8 @@ type Driver interface { GetVolumeName(v *volume.Volume) string // GetPortworxNamespace returns the Portworx namespace GetPortworxNamespace() (string, error) + // GetTokenFromConfigMap returns the token from the configmap + GetTokenFromConfigMap(configMapName string) (string, error) // GetServiceEndpoint returns the hostname of portworx service if it is present GetServiceEndpoint() (string, error) // UpgradePortworx upgrades portworx to the given docker image and tag diff --git a/drivers/volume/pso/pso.go b/drivers/volume/pso/pso.go index 3cc37657f..6d368e3d8 100644 --- a/drivers/volume/pso/pso.go +++ b/drivers/volume/pso/pso.go @@ -2,13 +2,17 @@ package pso import ( "fmt" - "github.com/libopenstorage/openstorage/api" "strings" + "github.com/libopenstorage/openstorage/api" + "github.com/portworx/sched-ops/k8s/core" + "github.com/portworx/torpedo/drivers/node" + "github.com/portworx/torpedo/drivers/volume" torpedovolume "github.com/portworx/torpedo/drivers/volume" "github.com/portworx/torpedo/drivers/volume/portworx" "github.com/portworx/torpedo/drivers/volume/portworx/schedops" + "github.com/portworx/torpedo/pkg/errors" "github.com/portworx/torpedo/pkg/log" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -111,6 +115,25 @@ func (i *pso) DeleteSnapshotsForVolumes(volumeNames []string, clusterProviderCre return nil } +// UpdateFBDANFSEndpoint updates the NFS endpoint for a given FBDA volume +func (i *pso) UpdateFBDANFSEndpoint(volumeName string, newEndpoint string) error { + log.Warnf("UpdateFBDANFSEndpoint function has not been implemented for volume driver - %s", i.String()) + return &errors.ErrNotSupported{ + Type: "Function", + Operation: "UpdateFBDANFSEndpoint()", + } +} + +// ValidatePureFBDAMountSource checks that, on all the given nodes, all the provided FBDA volumes are mounted using the expected IP +func (i *pso) ValidatePureFBDAMountSource(nodes []node.Node, vols []*volume.Volume, expectedIP string) error { + log.Warnf("ValidatePureFBDAMountSource function has not been implemented for volume driver - %s", i.String()) + return &errors.ErrNotSupported{ + Type: "Function", + Operation: "ValidatePureFBDAMountSource()", + } +} + + // GetPsoNamespace returns namespace where PSO is running func GetPsoNamespace() (string, error) { allServices, err := core.Instance().ListServices("", metav1.ListOptions{}) diff --git a/drivers/volume/volume.go b/drivers/volume/volume.go index d11ea42fa..70367b85b 100644 --- a/drivers/volume/volume.go +++ b/drivers/volume/volume.go @@ -142,6 +142,10 @@ type Driver interface { // params are the custom backup options passed DeleteAllCloudsnaps(name, sourceVolumeID string, params map[string]string) error + // GetCloudsnapsOfGivenVolume returns cloudsnap backups of given volume + // params are the custom backup options passed + GetCloudsnapsOfGivenVolume(volumeName string, sourceVolumeID string, params map[string]string) ([]*api.SdkCloudBackupInfo, error) + // ValidateCreateCloudsnap validates whether a cloudsnap backup can be created properly(or errored expectely) // params are the custom backup options passed ValidateCreateCloudsnap(name string, params map[string]string) error @@ -507,6 +511,17 @@ type Driver interface { GetPxctlStatus(n node.Node) (string, error) DeleteSnapshotsForVolumes(volumeNames []string, globalCredentialConfig string) error + + // EnableSkinnySnap Enables skinnysnap on the cluster + EnableSkinnySnap() error + + // UpdateSkinnySnapReplNum update skinnysnap Repl factor + UpdateSkinnySnapReplNum(repl string) error + // UpdateFBDANFSEndpoint updates the NFS endpoint for a given FBDA volume + UpdateFBDANFSEndpoint(volumeName string, newEndpoint string) error + + // ValidatePureFBDAMountSource checks that, on all the given nodes, all the provided FBDA volumes are mounted using the expected IP + ValidatePureFBDAMountSource(nodes []node.Node, vols []*Volume, expectedIP string) error } // StorageProvisionerType provisioner to be used for torpedo volumes diff --git a/go.mod b/go.mod index a8222eb36..289a01df9 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( github.com/fatih/color v1.15.0 github.com/gambol99/go-marathon v0.7.1 github.com/gin-gonic/gin v1.9.1 - github.com/go-sql-driver/mysql v1.6.0 + github.com/go-sql-driver/mysql v1.7.1 github.com/gofrs/flock v0.8.1 github.com/golang/protobuf v1.5.4 github.com/google/gnostic v0.6.9 @@ -31,19 +31,19 @@ require ( github.com/libopenstorage/autopilot-api v1.3.0 github.com/libopenstorage/cloudops v0.0.0-20230220114907-3e63dce1b413 github.com/libopenstorage/openstorage v9.4.47+incompatible - github.com/libopenstorage/operator v0.0.0-20240417190906-af0509c9db88 - github.com/libopenstorage/stork v1.4.1-0.20240417024347-acff28bbdb16 + github.com/libopenstorage/operator v0.0.0-20240523172951-e085c3099bd7 + github.com/libopenstorage/stork v1.4.1-0.20240424105137-8c6fa2a3f934 github.com/onsi/gomega v1.31.1 github.com/openshift/api v0.0.0-20230503133300-8bbcb7ca7183 github.com/oracle/oci-go-sdk/v65 v65.13.1 github.com/pborman/uuid v1.2.1 github.com/pkg/errors v0.9.1 github.com/portworx/pds-api-go-client v0.0.0-20231102112445-993d38984eae - github.com/portworx/px-backup-api v1.2.2-0.20240229114136-e58baeb9fbe1 - github.com/portworx/sched-ops v1.20.4-rc1.0.20240411193047-d17313c6c11b + github.com/portworx/px-backup-api v1.2.2-0.20240513165102-9eda9e2fc169 + github.com/portworx/sched-ops v1.20.4-rc1.0.20240514213912-ff0ae32b859a github.com/portworx/talisman v1.1.3 github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.63.0 - github.com/prometheus/client_golang v1.15.1 + github.com/prometheus/client_golang v1.17.0 github.com/rancher/norman v0.0.0-20230222213531-275a3e921940 github.com/rancher/rancher/pkg/client v0.0.0-20230203155537-a67566517525 github.com/sirupsen/logrus v1.9.3 @@ -62,9 +62,9 @@ require ( gopkg.in/natefinch/lumberjack.v2 v2.0.0 gopkg.in/yaml.v2 v2.4.0 helm.sh/helm/v3 v3.7.1 - k8s.io/api v0.27.1 - k8s.io/apiextensions-apiserver v0.26.5 - k8s.io/apimachinery v0.29.2 + k8s.io/api v0.29.3 + k8s.io/apiextensions-apiserver v0.28.4 + k8s.io/apimachinery v0.29.3 k8s.io/client-go v12.0.0+incompatible kubevirt.io/api v1.0.0 ) @@ -104,14 +104,14 @@ require ( github.com/google/pprof v0.0.0-20230228050547-1710fef4ab10 // indirect github.com/hashicorp/cronexpr v1.1.2 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect - github.com/jackc/pgconn v1.11.0 // indirect + github.com/jackc/pgconn v1.12.1 // indirect github.com/jackc/pgio v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgproto3/v2 v2.2.0 // indirect + github.com/jackc/pgproto3/v2 v2.3.0 // indirect github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect - github.com/jackc/pgtype v1.10.0 // indirect + github.com/jackc/pgtype v1.11.0 // indirect github.com/k8snetworkplumbingwg/network-attachment-definition-client v0.0.0-20191119172530-79f836b90111 // indirect - github.com/montanaflynn/stats v0.0.0-20180911141734-db72e6cae808 // indirect + github.com/montanaflynn/stats v0.7.0 // indirect github.com/oklog/ulid v1.3.1 // indirect github.com/openshift/custom-resource-status v1.1.2 // indirect github.com/prometheus/statsd_exporter v0.21.0 // indirect @@ -127,7 +127,6 @@ require ( go.opentelemetry.io/otel/metric v1.23.0 // indirect go.opentelemetry.io/otel/trace v1.23.0 // indirect go.uber.org/zap v1.26.0 // indirect - golang.org/x/exp v0.0.0-20230728194245-b0cb94b80691 // indirect golang.org/x/mod v0.14.0 // indirect golang.org/x/tools v0.16.1 // indirect knative.dev/pkg v0.0.0-20231023150739-56bfe0dd9626 // indirect @@ -147,15 +146,16 @@ require ( github.com/aws/aws-sdk-go-v2/service/eks v1.39.2 github.com/devans10/pugo/flasharray v0.0.0-20230602184138-1a5d930c950e github.com/hashicorp/nomad/api v0.0.0-20240209231933-e2bfdf0c1034 - github.com/jackc/pgx/v4 v4.15.0 + github.com/jackc/pgx/v4 v4.16.1 github.com/jetstack/cert-manager v1.7.3 github.com/jinzhu/copier v0.4.0 github.com/onsi/ginkgo/v2 v2.15.0 - github.com/pure-px/apis v0.0.0-20240326194748-e9f7f27de779 - github.com/pure-px/platform-api-go-client v0.0.0-20240422094205-23129136cfd2 + github.com/pure-px/apis v0.0.3 + github.com/pure-px/platform-api-go-client v0.0.0-20240529124619-a3e5f98d62f0 github.com/tektoncd/pipeline v0.56.0 go.mongodb.org/mongo-driver v1.14.0 - go.uber.org/multierr v1.10.0 + go.uber.org/multierr v1.11.0 + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 ) require ( @@ -211,7 +211,7 @@ require ( github.com/donovanhide/eventsource v0.0.0-20171031113327-3ed64d21fb0b // indirect github.com/emicklei/go-restful/v3 v3.10.2 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/evanphx/json-patch/v5 v5.6.0 // indirect + github.com/evanphx/json-patch/v5 v5.7.0 // indirect github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d // indirect github.com/fatih/structs v1.1.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect @@ -317,9 +317,9 @@ require ( github.com/portworx/kvdb v0.0.0-20230326003017-21a38cf82d4b // indirect github.com/pquerna/cachecontrol v0.1.0 // indirect github.com/prometheus-operator/prometheus-operator/pkg/client v0.46.0 // indirect - github.com/prometheus/client_model v0.4.0 // indirect - github.com/prometheus/common v0.42.0 // indirect - github.com/prometheus/procfs v0.9.0 // indirect + github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 // indirect + github.com/prometheus/common v0.44.0 // indirect + github.com/prometheus/procfs v0.11.1 // indirect github.com/rancher/wrangler v1.1.0 // indirect github.com/rubenv/sql-migrate v1.1.2 // indirect github.com/russross/blackfriday v1.6.0 // indirect @@ -361,12 +361,12 @@ require ( k8s.io/component-helpers v0.25.1 // indirect k8s.io/klog v1.0.0 // indirect k8s.io/klog/v2 v2.120.1 // indirect - k8s.io/kube-openapi v0.0.0-20230515203736-54b630e78af5 // indirect + k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect k8s.io/kubectl v0.25.2 // indirect k8s.io/kubernetes v1.25.1 // indirect k8s.io/utils v0.0.0-20240102154912-e7106e64919e // indirect oras.land/oras-go v1.2.0 // indirect - sigs.k8s.io/cluster-api v1.1.6 // indirect + sigs.k8s.io/cluster-api v0.2.11 sigs.k8s.io/controller-runtime v0.14.5 // indirect sigs.k8s.io/gcp-compute-persistent-disk-csi-driver v0.7.0 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect @@ -393,10 +393,10 @@ replace ( github.com/libopenstorage/autopilot-api => github.com/libopenstorage/autopilot-api v0.6.1-0.20210301232050-ca2633c6e114 // PX dependencies - github.com/libopenstorage/openstorage => github.com/libopenstorage/openstorage v1.0.1-0.20240221210452-7757fdc2b8ff + github.com/libopenstorage/openstorage => github.com/libopenstorage/openstorage v1.0.1-0.20240416193513-1e07b4359307 // Stork dependencies - // github.com/libopenstorage/stork => github.com/libopenstorage/stork v1.4.1-0.20230330233319-e17ea1b3fd81 + github.com/portworx/sched-ops => github.com/portworx/sched-ops v1.20.4-rc1.0.20240514213912-ff0ae32b859a helm.sh/helm/v3 => helm.sh/helm/v3 v3.10.3 @@ -419,6 +419,7 @@ replace ( k8s.io/klog/v2 => k8s.io/klog/v2 v2.70.1 k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.25.1 k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.25.1 + k8s.io/kube-openapi => k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1 k8s.io/kube-proxy => k8s.io/kube-proxy v0.25.1 k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.25.1 k8s.io/kubectl => k8s.io/kubectl v0.25.1 diff --git a/go.sum b/go.sum index f177bc931..cc2efa0b0 100644 --- a/go.sum +++ b/go.sum @@ -5,6 +5,7 @@ bazil.org/fuse v0.0.0-20180421153158-65cc252bf669/go.mod h1:Xbm+BRKSBEpa4q4hTSxo bazil.org/fuse v0.0.0-20200407214033-5883e5a4b512/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= bitbucket.org/bertimus9/systemstat v0.5.0/go.mod h1:EkUWPp8lKFPMXP8vnbpT5JDI0W/sTiLZAvN8ONWErHY= bitbucket.org/creachadair/shell v0.0.6/go.mod h1:8Qqi/cYk7vPnsOePHroKXDJYmb5x7ENhtiFtfZq8K+M= +bitbucket.org/creachadair/shell v0.0.7/go.mod h1:oqtXSSvSYr4624lnnabXHaBsYW6RD80caLi2b3hJk0U= cloud.google.com/go v0.25.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.30.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= @@ -35,6 +36,7 @@ cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPT cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= @@ -51,49 +53,171 @@ cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34h cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= +cloud.google.com/go v0.110.4/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go v0.110.6/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go v0.110.7/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go v0.110.8/go.mod h1:Iz8AkXJf1qmxC3Oxoep8R1T36w8B92yU29PcBhHO5fk= +cloud.google.com/go v0.110.9/go.mod h1:rpxevX/0Lqvlbc88b7Sc1SPNdyK1riNBTUU6JXhYNpM= +cloud.google.com/go v0.110.10/go.mod h1:v1OoFqYxiBkUrruItNM3eT4lLByNjxmJSV/xDKJNnic= +cloud.google.com/go v0.111.0/go.mod h1:0mibmpKP1TyOOFYQY5izo0LnT+ecvOQ0Sg3OdmMiNRU= cloud.google.com/go v0.112.1 h1:uJSeirPke5UNZHIb4SxfZklVSiWWVqW4oXlETwZziwM= cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4= cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= +cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= +cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68= +cloud.google.com/go/accessapproval v1.7.2/go.mod h1:/gShiq9/kK/h8T/eEn1BTzalDvk0mZxJlhfw0p+Xuc0= +cloud.google.com/go/accessapproval v1.7.3/go.mod h1:4l8+pwIxGTNqSf4T3ds8nLO94NQf0W/KnMNuQ9PbnP8= +cloud.google.com/go/accessapproval v1.7.4/go.mod h1:/aTEh45LzplQgFYdQdwPMR9YdX0UlhBmvB84uAmQKUc= cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= +cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= +cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= +cloud.google.com/go/accesscontextmanager v1.8.0/go.mod h1:uI+AI/r1oyWK99NN8cQ3UK76AMelMzgZCvJfsi2c+ps= +cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo= +cloud.google.com/go/accesscontextmanager v1.8.2/go.mod h1:E6/SCRM30elQJ2PKtFMs2YhfJpZSNcJyejhuzoId4Zk= +cloud.google.com/go/accesscontextmanager v1.8.3/go.mod h1:4i/JkF2JiFbhLnnpnfoTX5vRXfhf9ukhU1ANOTALTOQ= +cloud.google.com/go/accesscontextmanager v1.8.4/go.mod h1:ParU+WbMpD34s5JFEnGAnPBYAgUHozaTmDJU7aCU9+M= cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= +cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= +cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= +cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= +cloud.google.com/go/aiplatform v1.45.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= +cloud.google.com/go/aiplatform v1.48.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= +cloud.google.com/go/aiplatform v1.50.0/go.mod h1:IRc2b8XAMTa9ZmfJV1BCCQbieWWvDnP1A8znyz5N7y4= +cloud.google.com/go/aiplatform v1.51.0/go.mod h1:IRc2b8XAMTa9ZmfJV1BCCQbieWWvDnP1A8znyz5N7y4= +cloud.google.com/go/aiplatform v1.51.1/go.mod h1:kY3nIMAVQOK2XDqDPHaOuD9e+FdMA6OOpfBjsvaFSOo= +cloud.google.com/go/aiplatform v1.51.2/go.mod h1:hCqVYB3mY45w99TmetEoe8eCQEwZEp9WHxeZdcv9phw= +cloud.google.com/go/aiplatform v1.52.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= +cloud.google.com/go/aiplatform v1.54.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= +cloud.google.com/go/aiplatform v1.57.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= +cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= +cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= +cloud.google.com/go/analytics v0.21.2/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= +cloud.google.com/go/analytics v0.21.3/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= +cloud.google.com/go/analytics v0.21.4/go.mod h1:zZgNCxLCy8b2rKKVfC1YkC2vTrpfZmeRCySM3aUbskA= +cloud.google.com/go/analytics v0.21.5/go.mod h1:BQtOBHWTlJ96axpPPnw5CvGJ6i3Ve/qX2fTxR8qWyr8= +cloud.google.com/go/analytics v0.21.6/go.mod h1:eiROFQKosh4hMaNhF85Oc9WO97Cpa7RggD40e/RBy8w= cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= +cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= +cloud.google.com/go/apigateway v1.6.1/go.mod h1:ufAS3wpbRjqfZrzpvLC2oh0MFlpRJm2E/ts25yyqmXA= +cloud.google.com/go/apigateway v1.6.2/go.mod h1:CwMC90nnZElorCW63P2pAYm25AtQrHfuOkbRSHj0bT8= +cloud.google.com/go/apigateway v1.6.3/go.mod h1:k68PXWpEs6BVDTtnLQAyG606Q3mz8pshItwPXjgv44Y= +cloud.google.com/go/apigateway v1.6.4/go.mod h1:0EpJlVGH5HwAN4VF4Iec8TAzGN1aQgbxAWGJsnPCGGY= cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= +cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= +cloud.google.com/go/apigeeconnect v1.6.1/go.mod h1:C4awq7x0JpLtrlQCr8AzVIzAaYgngRqWf9S5Uhg+wWs= +cloud.google.com/go/apigeeconnect v1.6.2/go.mod h1:s6O0CgXT9RgAxlq3DLXvG8riw8PYYbU/v25jqP3Dy18= +cloud.google.com/go/apigeeconnect v1.6.3/go.mod h1:peG0HFQ0si2bN15M6QSjEW/W7Gy3NYkWGz7pFz13cbo= +cloud.google.com/go/apigeeconnect v1.6.4/go.mod h1:CapQCWZ8TCjnU0d7PobxhpOdVz/OVJ2Hr/Zcuu1xFx0= +cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= +cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= +cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= +cloud.google.com/go/apigeeregistry v0.7.1/go.mod h1:1XgyjZye4Mqtw7T9TsY4NW10U7BojBvG4RMD+vRDrIw= +cloud.google.com/go/apigeeregistry v0.7.2/go.mod h1:9CA2B2+TGsPKtfi3F7/1ncCCsL62NXBRfM6iPoGSM+8= +cloud.google.com/go/apigeeregistry v0.8.1/go.mod h1:MW4ig1N4JZQsXmBSwH4rwpgDonocz7FPBSw6XPGHmYw= +cloud.google.com/go/apigeeregistry v0.8.2/go.mod h1:h4v11TDGdeXJDJvImtgK2AFVvMIgGWjSb0HRnBSjcX8= +cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= +cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= +cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= +cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= +cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= +cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= +cloud.google.com/go/appengine v1.8.1/go.mod h1:6NJXGLVhZCN9aQ/AEDvmfzKEfoYBlfB80/BHiKVputY= +cloud.google.com/go/appengine v1.8.2/go.mod h1:WMeJV9oZ51pvclqFN2PqHoGnys7rK0rz6s3Mp6yMvDo= +cloud.google.com/go/appengine v1.8.3/go.mod h1:2oUPZ1LVZ5EXi+AF1ihNAF+S8JrzQ3till5m9VQkrsk= +cloud.google.com/go/appengine v1.8.4/go.mod h1:TZ24v+wXBujtkK77CXCpjZbnuTvsFNT41MUaZ28D6vg= cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= +cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= +cloud.google.com/go/area120 v0.8.1/go.mod h1:BVfZpGpB7KFVNxPiQBuHkX6Ed0rS51xIgmGyjrAfzsg= +cloud.google.com/go/area120 v0.8.2/go.mod h1:a5qfo+x77SRLXnCynFWPUZhnZGeSgvQ+Y0v1kSItkh4= +cloud.google.com/go/area120 v0.8.3/go.mod h1:5zj6pMzVTH+SVHljdSKC35sriR/CVvQZzG/Icdyriw0= +cloud.google.com/go/area120 v0.8.4/go.mod h1:jfawXjxf29wyBXr48+W+GyX/f8fflxp642D/bb9v68M= cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= +cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= +cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= +cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= +cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= +cloud.google.com/go/artifactregistry v1.14.1/go.mod h1:nxVdG19jTaSTu7yA7+VbWL346r3rIdkZ142BSQqhn5E= +cloud.google.com/go/artifactregistry v1.14.2/go.mod h1:Xk+QbsKEb0ElmyeMfdHAey41B+qBq3q5R5f5xD4XT3U= +cloud.google.com/go/artifactregistry v1.14.3/go.mod h1:A2/E9GXnsyXl7GUvQ/2CjHA+mVRoWAXC0brg2os+kNI= +cloud.google.com/go/artifactregistry v1.14.4/go.mod h1:SJJcZTMv6ce0LDMUnihCN7WSrI+kBSFV0KIKo8S8aYU= +cloud.google.com/go/artifactregistry v1.14.6/go.mod h1:np9LSFotNWHcjnOgh8UVK0RFPCTUGbO0ve3384xyHfE= cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= +cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= +cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= +cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= +cloud.google.com/go/asset v1.14.1/go.mod h1:4bEJ3dnHCqWCDbWJ/6Vn7GVI9LerSi7Rfdi03hd+WTQ= +cloud.google.com/go/asset v1.15.0/go.mod h1:tpKafV6mEut3+vN9ScGvCHXHj7FALFVta+okxFECHcg= +cloud.google.com/go/asset v1.15.1/go.mod h1:yX/amTvFWRpp5rcFq6XbCxzKT8RJUam1UoboE179jU4= +cloud.google.com/go/asset v1.15.2/go.mod h1:B6H5tclkXvXz7PD22qCA2TDxSVQfasa3iDlM89O2NXs= +cloud.google.com/go/asset v1.15.3/go.mod h1:yYLfUD4wL4X589A9tYrv4rFrba0QlDeag0CMcM5ggXU= cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= +cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= +cloud.google.com/go/assuredworkloads v1.11.1/go.mod h1:+F04I52Pgn5nmPG36CWFtxmav6+7Q+c5QyJoL18Lry0= +cloud.google.com/go/assuredworkloads v1.11.2/go.mod h1:O1dfr+oZJMlE6mw0Bp0P1KZSlj5SghMBvTpZqIcUAW4= +cloud.google.com/go/assuredworkloads v1.11.3/go.mod h1:vEjfTKYyRUaIeA0bsGJceFV2JKpVRgyG2op3jfa59Zs= +cloud.google.com/go/assuredworkloads v1.11.4/go.mod h1:4pwwGNwy1RP0m+y12ef3Q/8PaiWrIDQ6nD2E8kvWI9U= cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= +cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= +cloud.google.com/go/automl v1.13.1/go.mod h1:1aowgAHWYZU27MybSCFiukPO7xnyawv7pt3zK4bheQE= +cloud.google.com/go/automl v1.13.2/go.mod h1:gNY/fUmDEN40sP8amAX3MaXkxcqPIn7F1UIIPZpy4Mg= +cloud.google.com/go/automl v1.13.3/go.mod h1:Y8KwvyAZFOsMAPqUCfNu1AyclbC6ivCUF/MTwORymyY= +cloud.google.com/go/automl v1.13.4/go.mod h1:ULqwX/OLZ4hBVfKQaMtxMSTlPx0GqGbWN8uA/1EqCP8= cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= +cloud.google.com/go/baremetalsolution v1.1.1/go.mod h1:D1AV6xwOksJMV4OSlWHtWuFNZZYujJknMAP4Qa27QIA= +cloud.google.com/go/baremetalsolution v1.2.0/go.mod h1:68wi9AwPYkEWIUT4SvSGS9UJwKzNpshjHsH4lzk8iOw= +cloud.google.com/go/baremetalsolution v1.2.1/go.mod h1:3qKpKIw12RPXStwQXcbhfxVj1dqQGEvcmA+SX/mUR88= +cloud.google.com/go/baremetalsolution v1.2.2/go.mod h1:O5V6Uu1vzVelYahKfwEWRMaS3AbCkeYHy3145s1FkhM= +cloud.google.com/go/baremetalsolution v1.2.3/go.mod h1:/UAQ5xG3faDdy180rCUv47e0jvpp3BFxT+Cl0PFjw5g= cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= +cloud.google.com/go/batch v1.3.1/go.mod h1:VguXeQKXIYaeeIYbuozUmBR13AfL4SJP7IltNPS+A4A= +cloud.google.com/go/batch v1.4.1/go.mod h1:KdBmDD61K0ovcxoRHGrN6GmOBWeAOyCgKD0Mugx4Fkk= +cloud.google.com/go/batch v1.5.0/go.mod h1:KdBmDD61K0ovcxoRHGrN6GmOBWeAOyCgKD0Mugx4Fkk= +cloud.google.com/go/batch v1.5.1/go.mod h1:RpBuIYLkQu8+CWDk3dFD/t/jOCGuUpkpX+Y0n1Xccs8= +cloud.google.com/go/batch v1.6.1/go.mod h1:urdpD13zPe6YOK+6iZs/8/x2VBRofvblLpx0t57vM98= +cloud.google.com/go/batch v1.6.3/go.mod h1:J64gD4vsNSA2O5TtDB5AAux3nJ9iV8U3ilg3JDBYejU= +cloud.google.com/go/batch v1.7.0/go.mod h1:J64gD4vsNSA2O5TtDB5AAux3nJ9iV8U3ilg3JDBYejU= cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= +cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= +cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= +cloud.google.com/go/beyondcorp v0.6.1/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= +cloud.google.com/go/beyondcorp v1.0.0/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= +cloud.google.com/go/beyondcorp v1.0.1/go.mod h1:zl/rWWAFVeV+kx+X2Javly7o1EIQThU4WlkynffL/lk= +cloud.google.com/go/beyondcorp v1.0.2/go.mod h1:m8cpG7caD+5su+1eZr+TSvF6r21NdLJk4f9u4SP2Ntc= +cloud.google.com/go/beyondcorp v1.0.3/go.mod h1:HcBvnEd7eYr+HGDd5ZbuVmBYX019C6CEXBonXbCVwJo= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -104,26 +228,87 @@ cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM7 cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= +cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= +cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= +cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= +cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= +cloud.google.com/go/bigquery v1.52.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= +cloud.google.com/go/bigquery v1.53.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= +cloud.google.com/go/bigquery v1.55.0/go.mod h1:9Y5I3PN9kQWuid6183JFhOGOW3GcirA5LpsKCUn+2ec= +cloud.google.com/go/bigquery v1.56.0/go.mod h1:KDcsploXTEY7XT3fDQzMUZlpQLHzE4itubHrnmhUrZA= +cloud.google.com/go/bigquery v1.57.1/go.mod h1:iYzC0tGVWt1jqSzBHqCr3lrRn0u13E8e+AqowBsDgug= +cloud.google.com/go/bigtable v1.18.1/go.mod h1:NAVyfJot9jlo+KmgWLUJ5DJGwNDoChzAcrecLpmuAmY= cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= +cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= +cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= +cloud.google.com/go/billing v1.16.0/go.mod h1:y8vx09JSSJG02k5QxbycNRrN7FGZB6F3CAcgum7jvGA= +cloud.google.com/go/billing v1.17.0/go.mod h1:Z9+vZXEq+HwH7bhJkyI4OQcR6TSbeMrjlpEjO2vzY64= +cloud.google.com/go/billing v1.17.1/go.mod h1:Z9+vZXEq+HwH7bhJkyI4OQcR6TSbeMrjlpEjO2vzY64= +cloud.google.com/go/billing v1.17.2/go.mod h1:u/AdV/3wr3xoRBk5xvUzYMS1IawOAPwQMuHgHMdljDg= +cloud.google.com/go/billing v1.17.3/go.mod h1:z83AkoZ7mZwBGT3yTnt6rSGI1OOsHSIi6a5M3mJ8NaU= +cloud.google.com/go/billing v1.17.4/go.mod h1:5DOYQStCxquGprqfuid/7haD7th74kyMBHkjO/OvDtk= +cloud.google.com/go/billing v1.18.0/go.mod h1:5DOYQStCxquGprqfuid/7haD7th74kyMBHkjO/OvDtk= cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= +cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= +cloud.google.com/go/binaryauthorization v1.6.1/go.mod h1:TKt4pa8xhowwffiBmbrbcxijJRZED4zrqnwZ1lKH51U= +cloud.google.com/go/binaryauthorization v1.7.0/go.mod h1:Zn+S6QqTMn6odcMU1zDZCJxPjU2tZPV1oDl45lWY154= +cloud.google.com/go/binaryauthorization v1.7.1/go.mod h1:GTAyfRWYgcbsP3NJogpV3yeunbUIjx2T9xVeYovtURE= +cloud.google.com/go/binaryauthorization v1.7.2/go.mod h1:kFK5fQtxEp97m92ziy+hbu+uKocka1qRRL8MVJIgjv0= +cloud.google.com/go/binaryauthorization v1.7.3/go.mod h1:VQ/nUGRKhrStlGr+8GMS8f6/vznYLkdK5vaKfdCIpvU= +cloud.google.com/go/binaryauthorization v1.8.0/go.mod h1:VQ/nUGRKhrStlGr+8GMS8f6/vznYLkdK5vaKfdCIpvU= cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= +cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= +cloud.google.com/go/certificatemanager v1.7.1/go.mod h1:iW8J3nG6SaRYImIa+wXQ0g8IgoofDFRp5UMzaNk1UqI= +cloud.google.com/go/certificatemanager v1.7.2/go.mod h1:15SYTDQMd00kdoW0+XY5d9e+JbOPjp24AvF48D8BbcQ= +cloud.google.com/go/certificatemanager v1.7.3/go.mod h1:T/sZYuC30PTag0TLo28VedIRIj1KPGcOQzjWAptHa00= +cloud.google.com/go/certificatemanager v1.7.4/go.mod h1:FHAylPe/6IIKuaRmHbjbdLhGhVQ+CWHSD5Jq0k4+cCE= cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= +cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= +cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= +cloud.google.com/go/channel v1.16.0/go.mod h1:eN/q1PFSl5gyu0dYdmxNXscY/4Fi7ABmeHCJNf/oHmc= +cloud.google.com/go/channel v1.17.0/go.mod h1:RpbhJsGi/lXWAUM1eF4IbQGbsfVlg2o8Iiy2/YLfVT0= +cloud.google.com/go/channel v1.17.1/go.mod h1:xqfzcOZAcP4b/hUDH0GkGg1Sd5to6di1HOJn/pi5uBQ= +cloud.google.com/go/channel v1.17.2/go.mod h1:aT2LhnftnyfQceFql5I/mP8mIbiiJS4lWqgXA815zMk= +cloud.google.com/go/channel v1.17.3/go.mod h1:QcEBuZLGGrUMm7kNj9IbU1ZfmJq2apotsV83hbxX7eE= cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= +cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= +cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= +cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= +cloud.google.com/go/cloudbuild v1.10.1/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= +cloud.google.com/go/cloudbuild v1.13.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= +cloud.google.com/go/cloudbuild v1.14.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= +cloud.google.com/go/cloudbuild v1.14.1/go.mod h1:K7wGc/3zfvmYWOWwYTgF/d/UVJhS4pu+HAy7PL7mCsU= +cloud.google.com/go/cloudbuild v1.14.2/go.mod h1:Bn6RO0mBYk8Vlrt+8NLrru7WXlQ9/RDWz2uo5KG1/sg= +cloud.google.com/go/cloudbuild v1.14.3/go.mod h1:eIXYWmRt3UtggLnFGx4JvXcMj4kShhVzGndL1LwleEM= +cloud.google.com/go/cloudbuild v1.15.0/go.mod h1:eIXYWmRt3UtggLnFGx4JvXcMj4kShhVzGndL1LwleEM= cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= +cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= +cloud.google.com/go/clouddms v1.6.1/go.mod h1:Ygo1vL52Ov4TBZQquhz5fiw2CQ58gvu+PlS6PVXCpZI= +cloud.google.com/go/clouddms v1.7.0/go.mod h1:MW1dC6SOtI/tPNCciTsXtsGNEM0i0OccykPvv3hiYeM= +cloud.google.com/go/clouddms v1.7.1/go.mod h1:o4SR8U95+P7gZ/TX+YbJxehOCsM+fe6/brlrFquiszk= +cloud.google.com/go/clouddms v1.7.2/go.mod h1:Rk32TmWmHo64XqDvW7jgkFQet1tUKNVzs7oajtJT3jU= +cloud.google.com/go/clouddms v1.7.3/go.mod h1:fkN2HQQNUYInAU3NQ3vRLkV2iWs8lIdmBKOx4nrL6Hc= cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= +cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= +cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= +cloud.google.com/go/cloudtasks v1.11.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= +cloud.google.com/go/cloudtasks v1.12.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= +cloud.google.com/go/cloudtasks v1.12.2/go.mod h1:A7nYkjNlW2gUoROg1kvJrQGhJP/38UaWwsnuBDOBVUk= +cloud.google.com/go/cloudtasks v1.12.3/go.mod h1:GPVXhIOSGEaR+3xT4Fp72ScI+HjHffSS4B8+BaBB5Ys= +cloud.google.com/go/cloudtasks v1.12.4/go.mod h1:BEPu0Gtt2dU6FxZHNqqNdGqIG86qyWKBPGnsb7udGY0= cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= @@ -134,167 +319,558 @@ cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOt cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= +cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= +cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= +cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= +cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= +cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.21.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.1/go.mod h1:CqB3xpmPKKt3OJpW2ndFIXnA9A4xAy/F3Xp1ixncW78= +cloud.google.com/go/compute v1.23.2/go.mod h1:JJ0atRC0J/oWYiiVBmsSsrRnh92DhZPG4hFDcR04Rns= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute v1.24.0 h1:phWcR2eWzRJaL/kOiJwfFsPs4BaKq1j6vnpZrc1YlVg= cloud.google.com/go/compute v1.24.0/go.mod h1:kw1/T+h/+tK2LJK0wiPPx1intgdAM3j/g3hFDlscY40= cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= +cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= +cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= +cloud.google.com/go/contactcenterinsights v1.9.1/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= +cloud.google.com/go/contactcenterinsights v1.10.0/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= +cloud.google.com/go/contactcenterinsights v1.11.0/go.mod h1:hutBdImE4XNZ1NV4vbPJKSFOnQruhC5Lj9bZqWMTKiU= +cloud.google.com/go/contactcenterinsights v1.11.1/go.mod h1:FeNP3Kg8iteKM80lMwSk3zZZKVxr+PGnAId6soKuXwE= +cloud.google.com/go/contactcenterinsights v1.11.2/go.mod h1:A9PIR5ov5cRcd28KlDbmmXE8Aay+Gccer2h4wzkYFso= +cloud.google.com/go/contactcenterinsights v1.11.3/go.mod h1:HHX5wrz5LHVAwfI2smIotQG9x8Qd6gYilaHcLLLmNis= +cloud.google.com/go/contactcenterinsights v1.12.0/go.mod h1:HHX5wrz5LHVAwfI2smIotQG9x8Qd6gYilaHcLLLmNis= +cloud.google.com/go/contactcenterinsights v1.12.1/go.mod h1:HHX5wrz5LHVAwfI2smIotQG9x8Qd6gYilaHcLLLmNis= cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= +cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= +cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= +cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= +cloud.google.com/go/container v1.22.1/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= +cloud.google.com/go/container v1.24.0/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= +cloud.google.com/go/container v1.26.0/go.mod h1:YJCmRet6+6jnYYRS000T6k0D0xUXQgBSaJ7VwI8FBj4= +cloud.google.com/go/container v1.26.1/go.mod h1:5smONjPRUxeEpDG7bMKWfDL4sauswqEtnBK1/KKpR04= +cloud.google.com/go/container v1.26.2/go.mod h1:YlO84xCt5xupVbLaMY4s3XNE79MUJ+49VmkInr6HvF4= +cloud.google.com/go/container v1.27.1/go.mod h1:b1A1gJeTBXVLQ6GGw9/9M4FG94BEGsqJ5+t4d/3N7O4= +cloud.google.com/go/container v1.28.0/go.mod h1:b1A1gJeTBXVLQ6GGw9/9M4FG94BEGsqJ5+t4d/3N7O4= +cloud.google.com/go/container v1.29.0/go.mod h1:b1A1gJeTBXVLQ6GGw9/9M4FG94BEGsqJ5+t4d/3N7O4= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= +cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= +cloud.google.com/go/containeranalysis v0.10.1/go.mod h1:Ya2jiILITMY68ZLPaogjmOMNkwsDrWBSTyBubGXO7j0= +cloud.google.com/go/containeranalysis v0.11.0/go.mod h1:4n2e99ZwpGxpNcz+YsFT1dfOHPQFGcAC8FN2M2/ne/U= +cloud.google.com/go/containeranalysis v0.11.1/go.mod h1:rYlUOM7nem1OJMKwE1SadufX0JP3wnXj844EtZAwWLY= +cloud.google.com/go/containeranalysis v0.11.2/go.mod h1:xibioGBC1MD2j4reTyV1xY1/MvKaz+fyM9ENWhmIeP8= +cloud.google.com/go/containeranalysis v0.11.3/go.mod h1:kMeST7yWFQMGjiG9K7Eov+fPNQcGhb8mXj/UcTiWw9U= cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= +cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= +cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= +cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= +cloud.google.com/go/datacatalog v1.14.0/go.mod h1:h0PrGtlihoutNMp/uvwhawLQ9+c63Kz65UFqh49Yo+E= +cloud.google.com/go/datacatalog v1.14.1/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= +cloud.google.com/go/datacatalog v1.16.0/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= +cloud.google.com/go/datacatalog v1.17.1/go.mod h1:nCSYFHgtxh2MiEktWIz71s/X+7ds/UT9kp0PC7waCzE= +cloud.google.com/go/datacatalog v1.18.0/go.mod h1:nCSYFHgtxh2MiEktWIz71s/X+7ds/UT9kp0PC7waCzE= +cloud.google.com/go/datacatalog v1.18.1/go.mod h1:TzAWaz+ON1tkNr4MOcak8EBHX7wIRX/gZKM+yTVsv+A= +cloud.google.com/go/datacatalog v1.18.2/go.mod h1:SPVgWW2WEMuWHA+fHodYjmxPiMqcOiWfhc9OD5msigk= +cloud.google.com/go/datacatalog v1.18.3/go.mod h1:5FR6ZIF8RZrtml0VUao22FxhdjkoG+a0866rEnObryM= +cloud.google.com/go/datacatalog v1.19.0/go.mod h1:5FR6ZIF8RZrtml0VUao22FxhdjkoG+a0866rEnObryM= cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= +cloud.google.com/go/dataflow v0.9.1/go.mod h1:Wp7s32QjYuQDWqJPFFlnBKhkAtiFpMTdg00qGbnIHVw= +cloud.google.com/go/dataflow v0.9.2/go.mod h1:vBfdBZ/ejlTaYIGB3zB4T08UshH70vbtZeMD+urnUSo= +cloud.google.com/go/dataflow v0.9.3/go.mod h1:HI4kMVjcHGTs3jTHW/kv3501YW+eloiJSLxkJa/vqFE= +cloud.google.com/go/dataflow v0.9.4/go.mod h1:4G8vAkHYCSzU8b/kmsoR2lWyHJD85oMJPHMtan40K8w= cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= +cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= +cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= +cloud.google.com/go/dataform v0.8.1/go.mod h1:3BhPSiw8xmppbgzeBbmDvmSWlwouuJkXsXsb8UBih9M= +cloud.google.com/go/dataform v0.8.2/go.mod h1:X9RIqDs6NbGPLR80tnYoPNiO1w0wenKTb8PxxlhTMKM= +cloud.google.com/go/dataform v0.8.3/go.mod h1:8nI/tvv5Fso0drO3pEjtowz58lodx8MVkdV2q0aPlqg= +cloud.google.com/go/dataform v0.9.1/go.mod h1:pWTg+zGQ7i16pyn0bS1ruqIE91SdL2FDMvEYu/8oQxs= cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= +cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= +cloud.google.com/go/datafusion v1.7.1/go.mod h1:KpoTBbFmoToDExJUso/fcCiguGDk7MEzOWXUsJo0wsI= +cloud.google.com/go/datafusion v1.7.2/go.mod h1:62K2NEC6DRlpNmI43WHMWf9Vg/YvN6QVi8EVwifElI0= +cloud.google.com/go/datafusion v1.7.3/go.mod h1:eoLt1uFXKGBq48jy9LZ+Is8EAVLnmn50lNncLzwYokE= +cloud.google.com/go/datafusion v1.7.4/go.mod h1:BBs78WTOLYkT4GVZIXQCZT3GFpkpDN4aBY4NDX/jVlM= cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= +cloud.google.com/go/datalabeling v0.8.1/go.mod h1:XS62LBSVPbYR54GfYQsPXZjTW8UxCK2fkDciSrpRFdY= +cloud.google.com/go/datalabeling v0.8.2/go.mod h1:cyDvGHuJWu9U/cLDA7d8sb9a0tWLEletStu2sTmg3BE= +cloud.google.com/go/datalabeling v0.8.3/go.mod h1:tvPhpGyS/V7lqjmb3V0TaDdGvhzgR1JoW7G2bpi2UTI= +cloud.google.com/go/datalabeling v0.8.4/go.mod h1:Z1z3E6LHtffBGrNUkKwbwbDxTiXEApLzIgmymj8A3S8= cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= +cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= +cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= +cloud.google.com/go/dataplex v1.8.1/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= +cloud.google.com/go/dataplex v1.9.0/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= +cloud.google.com/go/dataplex v1.9.1/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= +cloud.google.com/go/dataplex v1.10.1/go.mod h1:1MzmBv8FvjYfc7vDdxhnLFNskikkB+3vl475/XdCDhs= +cloud.google.com/go/dataplex v1.10.2/go.mod h1:xdC8URdTrCrZMW6keY779ZT1cTOfV8KEPNsw+LTRT1Y= +cloud.google.com/go/dataplex v1.11.1/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= +cloud.google.com/go/dataplex v1.11.2/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= +cloud.google.com/go/dataplex v1.13.0/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= +cloud.google.com/go/dataproc/v2 v2.0.1/go.mod h1:7Ez3KRHdFGcfY7GcevBbvozX+zyWGcwLJvvAMwCaoZ4= +cloud.google.com/go/dataproc/v2 v2.2.0/go.mod h1:lZR7AQtwZPvmINx5J87DSOOpTfof9LVZju6/Qo4lmcY= +cloud.google.com/go/dataproc/v2 v2.2.1/go.mod h1:QdAJLaBjh+l4PVlVZcmrmhGccosY/omC1qwfQ61Zv/o= +cloud.google.com/go/dataproc/v2 v2.2.2/go.mod h1:aocQywVmQVF4i8CL740rNI/ZRpsaaC1Wh2++BJ7HEJ4= +cloud.google.com/go/dataproc/v2 v2.2.3/go.mod h1:G5R6GBc9r36SXv/RtZIVfB8SipI+xVn0bX5SxUzVYbY= +cloud.google.com/go/dataproc/v2 v2.3.0/go.mod h1:G5R6GBc9r36SXv/RtZIVfB8SipI+xVn0bX5SxUzVYbY= cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= +cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= +cloud.google.com/go/dataqna v0.8.1/go.mod h1:zxZM0Bl6liMePWsHA8RMGAfmTG34vJMapbHAxQ5+WA8= +cloud.google.com/go/dataqna v0.8.2/go.mod h1:KNEqgx8TTmUipnQsScOoDpq/VlXVptUqVMZnt30WAPs= +cloud.google.com/go/dataqna v0.8.3/go.mod h1:wXNBW2uvc9e7Gl5k8adyAMnLush1KVV6lZUhB+rqNu4= +cloud.google.com/go/dataqna v0.8.4/go.mod h1:mySRKjKg5Lz784P6sCov3p1QD+RZQONRMRjzGNcFd0c= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= +cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= +cloud.google.com/go/datastore v1.12.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= +cloud.google.com/go/datastore v1.12.1/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= +cloud.google.com/go/datastore v1.13.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= +cloud.google.com/go/datastore v1.14.0/go.mod h1:GAeStMBIt9bPS7jMJA85kgkpsMkvseWWXiaHya9Jes8= +cloud.google.com/go/datastore v1.15.0/go.mod h1:GAeStMBIt9bPS7jMJA85kgkpsMkvseWWXiaHya9Jes8= cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= +cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= +cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= +cloud.google.com/go/datastream v1.9.1/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= +cloud.google.com/go/datastream v1.10.0/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= +cloud.google.com/go/datastream v1.10.1/go.mod h1:7ngSYwnw95YFyTd5tOGBxHlOZiL+OtpjheqU7t2/s/c= +cloud.google.com/go/datastream v1.10.2/go.mod h1:W42TFgKAs/om6x/CdXX5E4oiAsKlH+e8MTGy81zdYt0= +cloud.google.com/go/datastream v1.10.3/go.mod h1:YR0USzgjhqA/Id0Ycu1VvZe8hEWwrkjuXrGbzeDOSEA= cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= +cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= +cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= +cloud.google.com/go/deploy v1.11.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= +cloud.google.com/go/deploy v1.13.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= +cloud.google.com/go/deploy v1.13.1/go.mod h1:8jeadyLkH9qu9xgO3hVWw8jVr29N1mnW42gRJT8GY6g= +cloud.google.com/go/deploy v1.14.1/go.mod h1:N8S0b+aIHSEeSr5ORVoC0+/mOPUysVt8ae4QkZYolAw= +cloud.google.com/go/deploy v1.14.2/go.mod h1:e5XOUI5D+YGldyLNZ21wbp9S8otJbBE4i88PtO9x/2g= +cloud.google.com/go/deploy v1.15.0/go.mod h1:e5XOUI5D+YGldyLNZ21wbp9S8otJbBE4i88PtO9x/2g= +cloud.google.com/go/deploy v1.16.0/go.mod h1:e5XOUI5D+YGldyLNZ21wbp9S8otJbBE4i88PtO9x/2g= cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= +cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= +cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= +cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= +cloud.google.com/go/dialogflow v1.38.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= +cloud.google.com/go/dialogflow v1.40.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= +cloud.google.com/go/dialogflow v1.43.0/go.mod h1:pDUJdi4elL0MFmt1REMvFkdsUTYSHq+rTCS8wg0S3+M= +cloud.google.com/go/dialogflow v1.44.0/go.mod h1:pDUJdi4elL0MFmt1REMvFkdsUTYSHq+rTCS8wg0S3+M= +cloud.google.com/go/dialogflow v1.44.1/go.mod h1:n/h+/N2ouKOO+rbe/ZnI186xImpqvCVj2DdsWS/0EAk= +cloud.google.com/go/dialogflow v1.44.2/go.mod h1:QzFYndeJhpVPElnFkUXxdlptx0wPnBWLCBT9BvtC3/c= +cloud.google.com/go/dialogflow v1.44.3/go.mod h1:mHly4vU7cPXVweuB5R0zsYKPMzy240aQdAu06SqBbAQ= +cloud.google.com/go/dialogflow v1.47.0/go.mod h1:mHly4vU7cPXVweuB5R0zsYKPMzy240aQdAu06SqBbAQ= cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= +cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= +cloud.google.com/go/dlp v1.10.1/go.mod h1:IM8BWz1iJd8njcNcG0+Kyd9OPnqnRNkDV8j42VT5KOI= +cloud.google.com/go/dlp v1.10.2/go.mod h1:ZbdKIhcnyhILgccwVDzkwqybthh7+MplGC3kZVZsIOQ= +cloud.google.com/go/dlp v1.10.3/go.mod h1:iUaTc/ln8I+QT6Ai5vmuwfw8fqTk2kaz0FvCwhLCom0= +cloud.google.com/go/dlp v1.11.1/go.mod h1:/PA2EnioBeXTL/0hInwgj0rfsQb3lpE3R8XUJxqUNKI= cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= +cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= +cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= +cloud.google.com/go/documentai v1.20.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= +cloud.google.com/go/documentai v1.22.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= +cloud.google.com/go/documentai v1.22.1/go.mod h1:LKs22aDHbJv7ufXuPypzRO7rG3ALLJxzdCXDPutw4Qc= +cloud.google.com/go/documentai v1.23.0/go.mod h1:LKs22aDHbJv7ufXuPypzRO7rG3ALLJxzdCXDPutw4Qc= +cloud.google.com/go/documentai v1.23.2/go.mod h1:Q/wcRT+qnuXOpjAkvOV4A+IeQl04q2/ReT7SSbytLSo= +cloud.google.com/go/documentai v1.23.4/go.mod h1:4MYAaEMnADPN1LPN5xboDR5QVB6AgsaxgFdJhitlE2Y= +cloud.google.com/go/documentai v1.23.5/go.mod h1:ghzBsyVTiVdkfKaUCum/9bGBEyBjDO4GfooEcYKhN+g= +cloud.google.com/go/documentai v1.23.6/go.mod h1:ghzBsyVTiVdkfKaUCum/9bGBEyBjDO4GfooEcYKhN+g= cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= +cloud.google.com/go/domains v0.9.1/go.mod h1:aOp1c0MbejQQ2Pjf1iJvnVyT+z6R6s8pX66KaCSDYfE= +cloud.google.com/go/domains v0.9.2/go.mod h1:3YvXGYzZG1Temjbk7EyGCuGGiXHJwVNmwIf+E/cUp5I= +cloud.google.com/go/domains v0.9.3/go.mod h1:29k66YNDLDY9LCFKpGFeh6Nj9r62ZKm5EsUJxAl84KU= +cloud.google.com/go/domains v0.9.4/go.mod h1:27jmJGShuXYdUNjyDG0SodTfT5RwLi7xmH334Gvi3fY= cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= +cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= +cloud.google.com/go/edgecontainer v1.1.1/go.mod h1:O5bYcS//7MELQZs3+7mabRqoWQhXCzenBu0R8bz2rwk= +cloud.google.com/go/edgecontainer v1.1.2/go.mod h1:wQRjIzqxEs9e9wrtle4hQPSR1Y51kqN75dgF7UllZZ4= +cloud.google.com/go/edgecontainer v1.1.3/go.mod h1:Ll2DtIABzEfaxaVSbwj3QHFaOOovlDFiWVDu349jSsA= +cloud.google.com/go/edgecontainer v1.1.4/go.mod h1:AvFdVuZuVGdgaE5YvlL1faAoa1ndRR/5XhXZvPBHbsE= cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= +cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= +cloud.google.com/go/essentialcontacts v1.6.2/go.mod h1:T2tB6tX+TRak7i88Fb2N9Ok3PvY3UNbUsMag9/BARh4= +cloud.google.com/go/essentialcontacts v1.6.3/go.mod h1:yiPCD7f2TkP82oJEFXFTou8Jl8L6LBRPeBEkTaO0Ggo= +cloud.google.com/go/essentialcontacts v1.6.4/go.mod h1:iju5Vy3d9tJUg0PYMd1nHhjV7xoCXaOAVabrwLaPBEM= +cloud.google.com/go/essentialcontacts v1.6.5/go.mod h1:jjYbPzw0x+yglXC890l6ECJWdYeZ5dlYACTFL0U/VuM= cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= +cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= +cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= +cloud.google.com/go/eventarc v1.12.1/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= +cloud.google.com/go/eventarc v1.13.0/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= +cloud.google.com/go/eventarc v1.13.1/go.mod h1:EqBxmGHFrruIara4FUQ3RHlgfCn7yo1HYsu2Hpt/C3Y= +cloud.google.com/go/eventarc v1.13.2/go.mod h1:X9A80ShVu19fb4e5sc/OLV7mpFUKZMwfJFeeWhcIObM= +cloud.google.com/go/eventarc v1.13.3/go.mod h1:RWH10IAZIRcj1s/vClXkBgMHwh59ts7hSWcqD3kaclg= cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= +cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= +cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= +cloud.google.com/go/filestore v1.7.1/go.mod h1:y10jsorq40JJnjR/lQ8AfFbbcGlw3g+Dp8oN7i7FjV4= +cloud.google.com/go/filestore v1.7.2/go.mod h1:TYOlyJs25f/omgj+vY7/tIG/E7BX369triSPzE4LdgE= +cloud.google.com/go/filestore v1.7.3/go.mod h1:Qp8WaEERR3cSkxToxFPHh/b8AACkSut+4qlCjAmKTV0= +cloud.google.com/go/filestore v1.7.4/go.mod h1:S5JCxIbFjeBhWMTfIYH2Jx24J6BqjwpkkPl+nBA5DlI= +cloud.google.com/go/filestore v1.8.0/go.mod h1:S5JCxIbFjeBhWMTfIYH2Jx24J6BqjwpkkPl+nBA5DlI= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/firestore v1.2.0/go.mod h1:iISCjWnTpnoJT1R287xRdjvQHJrxQOpeah4phb5D3h0= cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= +cloud.google.com/go/firestore v1.11.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= +cloud.google.com/go/firestore v1.12.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= +cloud.google.com/go/firestore v1.13.0/go.mod h1:QojqqOh8IntInDUSTAh0c8ZsPYAr68Ma8c5DWOy8xb8= +cloud.google.com/go/firestore v1.14.0/go.mod h1:96MVaHLsEhbvkBEdZgfN+AS/GIkco1LRpH9Xp9YZfzQ= cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= +cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= +cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= +cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= +cloud.google.com/go/functions v1.15.1/go.mod h1:P5yNWUTkyU+LvW/S9O6V+V423VZooALQlqoXdoPz5AE= +cloud.google.com/go/functions v1.15.2/go.mod h1:CHAjtcR6OU4XF2HuiVeriEdELNcnvRZSk1Q8RMqy4lE= +cloud.google.com/go/functions v1.15.3/go.mod h1:r/AMHwBheapkkySEhiZYLDBwVJCdlRwsm4ieJu35/Ug= +cloud.google.com/go/functions v1.15.4/go.mod h1:CAsTc3VlRMVvx+XqXxKqVevguqJpnVip4DdonFsX28I= cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= +cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= +cloud.google.com/go/gaming v1.10.1/go.mod h1:XQQvtfP8Rb9Rxnxm5wFVpAp9zCQkJi2bLIb7iHGwB3s= cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= +cloud.google.com/go/gkebackup v1.3.0/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= +cloud.google.com/go/gkebackup v1.3.1/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= +cloud.google.com/go/gkebackup v1.3.2/go.mod h1:OMZbXzEJloyXMC7gqdSB+EOEQ1AKcpGYvO3s1ec5ixk= +cloud.google.com/go/gkebackup v1.3.3/go.mod h1:eMk7/wVV5P22KBakhQnJxWSVftL1p4VBFLpv0kIft7I= +cloud.google.com/go/gkebackup v1.3.4/go.mod h1:gLVlbM8h/nHIs09ns1qx3q3eaXcGSELgNu1DWXYz1HI= cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= +cloud.google.com/go/gkeconnect v0.8.1/go.mod h1:KWiK1g9sDLZqhxB2xEuPV8V9NYzrqTUmQR9shJHpOZw= +cloud.google.com/go/gkeconnect v0.8.2/go.mod h1:6nAVhwchBJYgQCXD2pHBFQNiJNyAd/wyxljpaa6ZPrY= +cloud.google.com/go/gkeconnect v0.8.3/go.mod h1:i9GDTrfzBSUZGCe98qSu1B8YB8qfapT57PenIb820Jo= +cloud.google.com/go/gkeconnect v0.8.4/go.mod h1:84hZz4UMlDCKl8ifVW8layK4WHlMAFeq8vbzjU0yJkw= cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= +cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= +cloud.google.com/go/gkehub v0.14.1/go.mod h1:VEXKIJZ2avzrbd7u+zeMtW00Y8ddk/4V9511C9CQGTY= +cloud.google.com/go/gkehub v0.14.2/go.mod h1:iyjYH23XzAxSdhrbmfoQdePnlMj2EWcvnR+tHdBQsCY= +cloud.google.com/go/gkehub v0.14.3/go.mod h1:jAl6WafkHHW18qgq7kqcrXYzN08hXeK/Va3utN8VKg8= +cloud.google.com/go/gkehub v0.14.4/go.mod h1:Xispfu2MqnnFt8rV/2/3o73SK1snL8s9dYJ9G2oQMfc= cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= +cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= +cloud.google.com/go/gkemulticloud v0.6.1/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= +cloud.google.com/go/gkemulticloud v1.0.0/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= +cloud.google.com/go/gkemulticloud v1.0.1/go.mod h1:AcrGoin6VLKT/fwZEYuqvVominLriQBCKmbjtnbMjG8= +cloud.google.com/go/gkemulticloud v1.0.2/go.mod h1:+ee5VXxKb3H1l4LZAcgWB/rvI16VTNTrInWxDjAGsGo= +cloud.google.com/go/gkemulticloud v1.0.3/go.mod h1:7NpJBN94U6DY1xHIbsDqB2+TFZUfjLUKLjUX8NGLor0= cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/grafeas v0.3.0/go.mod h1:P7hgN24EyONOTMyeJH6DxG4zD7fwiYa5Q6GUgyFSOU8= cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= +cloud.google.com/go/gsuiteaddons v1.6.1/go.mod h1:CodrdOqRZcLp5WOwejHWYBjZvfY0kOphkAKpF/3qdZY= +cloud.google.com/go/gsuiteaddons v1.6.2/go.mod h1:K65m9XSgs8hTF3X9nNTPi8IQueljSdYo9F+Mi+s4MyU= +cloud.google.com/go/gsuiteaddons v1.6.3/go.mod h1:sCFJkZoMrLZT3JTb8uJqgKPNshH2tfXeCwTFRebTq48= +cloud.google.com/go/gsuiteaddons v1.6.4/go.mod h1:rxtstw7Fx22uLOXBpsvb9DUbC+fiXs7rF4U29KHM/pE= cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/iam v0.4.0/go.mod h1:cbaZxyScUhxl7ZAkNWiALgihfP75wS/fUsVNaa1r3vA= cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= cloud.google.com/go/iam v0.10.0/go.mod h1:nXAECrMt2qHpF6RZUZseteD6QyanL68reN4OXPw0UWM= +cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= +cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= +cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= +cloud.google.com/go/iam v1.0.1/go.mod h1:yR3tmSL8BcZB4bxByRv2jkSIahVmCtfKZwLYGBalRE8= +cloud.google.com/go/iam v1.1.0/go.mod h1:nxdHjaKfCr7fNYx/HJMM8LgiMugmveWlkatear5gVyk= +cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= +cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= +cloud.google.com/go/iam v1.1.3/go.mod h1:3khUlaBXfPKKe7huYgEpDn6FtgRyMEqbkvBxrQyY5SE= +cloud.google.com/go/iam v1.1.4/go.mod h1:l/rg8l1AaA+VFMho/HYx2Vv6xinPSLMF8qfhRPIZ0L8= +cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= cloud.google.com/go/iam v1.1.6 h1:bEa06k05IO4f4uJonbB5iAgKTPpABy1ayxaIZV/GHVc= cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI= cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= +cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= +cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= +cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= +cloud.google.com/go/iap v1.8.1/go.mod h1:sJCbeqg3mvWLqjZNsI6dfAtbbV1DL2Rl7e1mTyXYREQ= +cloud.google.com/go/iap v1.9.0/go.mod h1:01OFxd1R+NFrg78S+hoPV5PxEzv22HXaNqUUlmNHFuY= +cloud.google.com/go/iap v1.9.1/go.mod h1:SIAkY7cGMLohLSdBR25BuIxO+I4fXJiL06IBL7cy/5Q= +cloud.google.com/go/iap v1.9.2/go.mod h1:GwDTOs047PPSnwRD0Us5FKf4WDRcVvHg1q9WVkKBhdI= +cloud.google.com/go/iap v1.9.3/go.mod h1:DTdutSZBqkkOm2HEOTBzhZxh2mwwxshfD/h3yofAiCw= cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= +cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= +cloud.google.com/go/ids v1.4.1/go.mod h1:np41ed8YMU8zOgv53MMMoCntLTn2lF+SUzlM+O3u/jw= +cloud.google.com/go/ids v1.4.2/go.mod h1:3vw8DX6YddRu9BncxuzMyWn0g8+ooUjI2gslJ7FH3vk= +cloud.google.com/go/ids v1.4.3/go.mod h1:9CXPqI3GedjmkjbMWCUhMZ2P2N7TUMzAkVXYEH2orYU= +cloud.google.com/go/ids v1.4.4/go.mod h1:z+WUc2eEl6S/1aZWzwtVNWoSZslgzPxAboS0lZX0HjI= cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= +cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= +cloud.google.com/go/iot v1.7.1/go.mod h1:46Mgw7ev1k9KqK1ao0ayW9h0lI+3hxeanz+L1zmbbbk= +cloud.google.com/go/iot v1.7.2/go.mod h1:q+0P5zr1wRFpw7/MOgDXrG/HVA+l+cSwdObffkrpnSg= +cloud.google.com/go/iot v1.7.3/go.mod h1:t8itFchkol4VgNbHnIq9lXoOOtHNR3uAACQMYbN9N4I= +cloud.google.com/go/iot v1.7.4/go.mod h1:3TWqDVvsddYBG++nHSZmluoCAVGr1hAcabbWZNKEZLk= cloud.google.com/go/kms v1.3.0/go.mod h1:EIdZ6hpR15zmiaKC8YKYoXplDFnL+Z6f5VCGHJMDhLs= cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= +cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= +cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= +cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= +cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= +cloud.google.com/go/kms v1.11.0/go.mod h1:hwdiYC0xjnWsKQQCQQmIQnS9asjYVSK6jtXm+zFqXLM= +cloud.google.com/go/kms v1.12.1/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= +cloud.google.com/go/kms v1.15.0/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= +cloud.google.com/go/kms v1.15.2/go.mod h1:3hopT4+7ooWRCjc2DxgnpESFxhIraaI2IpAVUEhbT/w= +cloud.google.com/go/kms v1.15.3/go.mod h1:AJdXqHxS2GlPyduM99s9iGqi2nwbviBbhV/hdmt4iOQ= +cloud.google.com/go/kms v1.15.4/go.mod h1:L3Sdj6QTHK8dfwK5D1JLsAyELsNMnd3tAIwGS4ltKpc= +cloud.google.com/go/kms v1.15.5/go.mod h1:cU2H5jnp6G2TDpUGZyqTCoy1n16fbubHZjmVXSMtwDI= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= +cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= +cloud.google.com/go/language v1.10.1/go.mod h1:CPp94nsdVNiQEt1CNjF5WkTcisLiHPyIbMhvR8H2AW0= +cloud.google.com/go/language v1.11.0/go.mod h1:uDx+pFDdAKTY8ehpWbiXyQdz8tDSYLJbQcXsCkjYyvQ= +cloud.google.com/go/language v1.11.1/go.mod h1:Xyid9MG9WOX3utvDbpX7j3tXDmmDooMyMDqgUVpH17U= +cloud.google.com/go/language v1.12.1/go.mod h1:zQhalE2QlQIxbKIZt54IASBzmZpN/aDASea5zl1l+J4= +cloud.google.com/go/language v1.12.2/go.mod h1:9idWapzr/JKXBBQ4lWqVX/hcadxB194ry20m/bTrhWc= cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= +cloud.google.com/go/lifesciences v0.9.1/go.mod h1:hACAOd1fFbCGLr/+weUKRAJas82Y4vrL3O5326N//Wc= +cloud.google.com/go/lifesciences v0.9.2/go.mod h1:QHEOO4tDzcSAzeJg7s2qwnLM2ji8IRpQl4p6m5Z9yTA= +cloud.google.com/go/lifesciences v0.9.3/go.mod h1:gNGBOJV80IWZdkd+xz4GQj4mbqaz737SCLHn2aRhQKM= +cloud.google.com/go/lifesciences v0.9.4/go.mod h1:bhm64duKhMi7s9jR9WYJYvjAFJwRqNj+Nia7hF0Z7JA= cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= +cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= +cloud.google.com/go/logging v1.8.1/go.mod h1:TJjR+SimHwuC8MZ9cjByQulAMgni+RkXeI3wwctHJEI= cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/longrunning v0.4.2/go.mod h1:OHrnaYyLUV6oqwh0xiS7e5sLQhP1m0QU9R+WhGDMgIQ= +cloud.google.com/go/longrunning v0.5.0/go.mod h1:0JNuqRShmscVAhIACGtskSAWtqtOoPkwP0YF1oVEchc= +cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= +cloud.google.com/go/longrunning v0.5.2/go.mod h1:nqo6DQbNV2pXhGDbDMoN2bWz68MjZUzqv2YttZiveCs= +cloud.google.com/go/longrunning v0.5.3/go.mod h1:y/0ga59EYu58J6SHmmQOvekvND2qODbu8ywBBW7EK7Y= +cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI= cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= +cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak= +cloud.google.com/go/managedidentities v1.6.2/go.mod h1:5c2VG66eCa0WIq6IylRk3TBW83l161zkFvCj28X7jn8= +cloud.google.com/go/managedidentities v1.6.3/go.mod h1:tewiat9WLyFN0Fi7q1fDD5+0N4VUoL0SCX0OTCthZq4= +cloud.google.com/go/managedidentities v1.6.4/go.mod h1:WgyaECfHmF00t/1Uk8Oun3CQ2PGUtjc3e9Alh79wyiM= +cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= +cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= +cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= +cloud.google.com/go/maps v1.3.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= +cloud.google.com/go/maps v1.4.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= +cloud.google.com/go/maps v1.4.1/go.mod h1:BxSa0BnW1g2U2gNdbq5zikLlHUuHW0GFWh7sgML2kIY= +cloud.google.com/go/maps v1.5.1/go.mod h1:NPMZw1LJwQZYCfz4y+EIw+SI+24A4bpdFJqdKVr0lt4= +cloud.google.com/go/maps v1.6.1/go.mod h1:4+buOHhYXFBp58Zj/K+Lc1rCmJssxxF4pJ5CJnhdz18= +cloud.google.com/go/maps v1.6.2/go.mod h1:4+buOHhYXFBp58Zj/K+Lc1rCmJssxxF4pJ5CJnhdz18= cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= +cloud.google.com/go/mediatranslation v0.8.1/go.mod h1:L/7hBdEYbYHQJhX2sldtTO5SZZ1C1vkapubj0T2aGig= +cloud.google.com/go/mediatranslation v0.8.2/go.mod h1:c9pUaDRLkgHRx3irYE5ZC8tfXGrMYwNZdmDqKMSfFp8= +cloud.google.com/go/mediatranslation v0.8.3/go.mod h1:F9OnXTy336rteOEywtY7FOqCk+J43o2RF638hkOQl4Y= +cloud.google.com/go/mediatranslation v0.8.4/go.mod h1:9WstgtNVAdN53m6TQa5GjIjLqKQPXe74hwSCxUP6nj4= cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= +cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= +cloud.google.com/go/memcache v1.10.1/go.mod h1:47YRQIarv4I3QS5+hoETgKO40InqzLP6kpNLvyXuyaA= +cloud.google.com/go/memcache v1.10.2/go.mod h1:f9ZzJHLBrmd4BkguIAa/l/Vle6uTHzHokdnzSWOdQ6A= +cloud.google.com/go/memcache v1.10.3/go.mod h1:6z89A41MT2DVAW0P4iIRdu5cmRTsbsFn4cyiIx8gbwo= +cloud.google.com/go/memcache v1.10.4/go.mod h1:v/d8PuC8d1gD6Yn5+I3INzLR01IDn0N4Ym56RgikSI0= cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= +cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= +cloud.google.com/go/metastore v1.11.1/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= +cloud.google.com/go/metastore v1.12.0/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= +cloud.google.com/go/metastore v1.13.0/go.mod h1:URDhpG6XLeh5K+Glq0NOt74OfrPKTwS62gEPZzb5SOk= +cloud.google.com/go/metastore v1.13.1/go.mod h1:IbF62JLxuZmhItCppcIfzBBfUFq0DIB9HPDoLgWrVOU= +cloud.google.com/go/metastore v1.13.2/go.mod h1:KS59dD+unBji/kFebVp8XU/quNSyo8b6N6tPGspKszA= +cloud.google.com/go/metastore v1.13.3/go.mod h1:K+wdjXdtkdk7AQg4+sXS8bRrQa9gcOr+foOMF2tqINE= +cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= cloud.google.com/go/monitoring v1.2.0/go.mod h1:tE8I08OzjWmXLhCopnPaUDpfGOEJOonfWXGR9E9SsFo= cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= +cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= +cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= +cloud.google.com/go/monitoring v1.15.1/go.mod h1:lADlSAlFdbqQuwwpaImhsJXu1QSdd3ojypXrFSMr2rM= +cloud.google.com/go/monitoring v1.16.0/go.mod h1:Ptp15HgAyM1fNICAojDMoNc/wUmn67mLHQfyqbw+poY= +cloud.google.com/go/monitoring v1.16.1/go.mod h1:6HsxddR+3y9j+o/cMJH6q/KJ/CBTvM/38L/1m7bTRJ4= +cloud.google.com/go/monitoring v1.16.2/go.mod h1:B44KGwi4ZCF8Rk/5n+FWeispDXoKSk9oss2QNlXJBgc= +cloud.google.com/go/monitoring v1.16.3/go.mod h1:KwSsX5+8PnXv5NJnICZzW2R8pWTis8ypC4zmdRD63Tw= cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= +cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= +cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= +cloud.google.com/go/networkconnectivity v1.12.1/go.mod h1:PelxSWYM7Sh9/guf8CFhi6vIqf19Ir/sbfZRUwXh92E= +cloud.google.com/go/networkconnectivity v1.13.0/go.mod h1:SAnGPes88pl7QRLUen2HmcBSE9AowVAcdug8c0RSBFk= +cloud.google.com/go/networkconnectivity v1.14.0/go.mod h1:SAnGPes88pl7QRLUen2HmcBSE9AowVAcdug8c0RSBFk= +cloud.google.com/go/networkconnectivity v1.14.1/go.mod h1:LyGPXR742uQcDxZ/wv4EI0Vu5N6NKJ77ZYVnDe69Zug= +cloud.google.com/go/networkconnectivity v1.14.2/go.mod h1:5UFlwIisZylSkGG1AdwK/WZUaoz12PKu6wODwIbFzJo= +cloud.google.com/go/networkconnectivity v1.14.3/go.mod h1:4aoeFdrJpYEXNvrnfyD5kIzs8YtHg945Og4koAjHQek= cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= +cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= +cloud.google.com/go/networkmanagement v1.8.0/go.mod h1:Ho/BUGmtyEqrttTgWEe7m+8vDdK74ibQc+Be0q7Fof0= +cloud.google.com/go/networkmanagement v1.9.0/go.mod h1:UTUaEU9YwbCAhhz3jEOHr+2/K/MrBk2XxOLS89LQzFw= +cloud.google.com/go/networkmanagement v1.9.1/go.mod h1:CCSYgrQQvW73EJawO2QamemYcOb57LvrDdDU51F0mcI= +cloud.google.com/go/networkmanagement v1.9.2/go.mod h1:iDGvGzAoYRghhp4j2Cji7sF899GnfGQcQRQwgVOWnDw= +cloud.google.com/go/networkmanagement v1.9.3/go.mod h1:y7WMO1bRLaP5h3Obm4tey+NquUvB93Co1oh4wpL+XcU= cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= +cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= +cloud.google.com/go/networksecurity v0.9.1/go.mod h1:MCMdxOKQ30wsBI1eI659f9kEp4wuuAueoC9AJKSPWZQ= +cloud.google.com/go/networksecurity v0.9.2/go.mod h1:jG0SeAttWzPMUILEHDUvFYdQTl8L/E/KC8iZDj85lEI= +cloud.google.com/go/networksecurity v0.9.3/go.mod h1:l+C0ynM6P+KV9YjOnx+kk5IZqMSLccdBqW6GUoF4p/0= +cloud.google.com/go/networksecurity v0.9.4/go.mod h1:E9CeMZ2zDsNBkr8axKSYm8XyTqNhiCHf1JO/Vb8mD1w= cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= +cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= +cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= +cloud.google.com/go/notebooks v1.9.1/go.mod h1:zqG9/gk05JrzgBt4ghLzEepPHNwE5jgPcHZRKhlC1A8= +cloud.google.com/go/notebooks v1.10.0/go.mod h1:SOPYMZnttHxqot0SGSFSkRrwE29eqnKPBJFqgWmiK2k= +cloud.google.com/go/notebooks v1.10.1/go.mod h1:5PdJc2SgAybE76kFQCWrTfJolCOUQXF97e+gteUUA6A= +cloud.google.com/go/notebooks v1.11.1/go.mod h1:V2Zkv8wX9kDCGRJqYoI+bQAaoVeE5kSiz4yYHd2yJwQ= +cloud.google.com/go/notebooks v1.11.2/go.mod h1:z0tlHI/lREXC8BS2mIsUeR3agM1AkgLiS+Isov3SS70= cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= +cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= +cloud.google.com/go/optimization v1.4.1/go.mod h1:j64vZQP7h9bO49m2rVaTVoNM0vEBEN5eKPUPbZyXOrk= +cloud.google.com/go/optimization v1.5.0/go.mod h1:evo1OvTxeBRBu6ydPlrIRizKY/LJKo/drDMMRKqGEUU= +cloud.google.com/go/optimization v1.5.1/go.mod h1:NC0gnUD5MWVAF7XLdoYVPmYYVth93Q6BUzqAq3ZwtV8= +cloud.google.com/go/optimization v1.6.1/go.mod h1:hH2RYPTTM9e9zOiTaYPTiGPcGdNZVnBSBxjIAJzUkqo= +cloud.google.com/go/optimization v1.6.2/go.mod h1:mWNZ7B9/EyMCcwNl1frUGEuY6CPijSkz88Fz2vwKPOY= cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= +cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= +cloud.google.com/go/orchestration v1.8.1/go.mod h1:4sluRF3wgbYVRqz7zJ1/EUNc90TTprliq9477fGobD8= +cloud.google.com/go/orchestration v1.8.2/go.mod h1:T1cP+6WyTmh6LSZzeUhvGf0uZVmJyTx7t8z7Vg87+A0= +cloud.google.com/go/orchestration v1.8.3/go.mod h1:xhgWAYqlbYjlz2ftbFghdyqENYW+JXuhBx9KsjMoGHs= +cloud.google.com/go/orchestration v1.8.4/go.mod h1:d0lywZSVYtIoSZXb0iFjv9SaL13PGyVOKDxqGxEf/qI= cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= +cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= +cloud.google.com/go/orgpolicy v1.11.0/go.mod h1:2RK748+FtVvnfuynxBzdnyu7sygtoZa1za/0ZfpOs1M= +cloud.google.com/go/orgpolicy v1.11.1/go.mod h1:8+E3jQcpZJQliP+zaFfayC2Pg5bmhuLK755wKhIIUCE= +cloud.google.com/go/orgpolicy v1.11.2/go.mod h1:biRDpNwfyytYnmCRWZWxrKF22Nkz9eNVj9zyaBdpm1o= +cloud.google.com/go/orgpolicy v1.11.3/go.mod h1:oKAtJ/gkMjum5icv2aujkP4CxROxPXsBbYGCDbPO8MM= +cloud.google.com/go/orgpolicy v1.11.4/go.mod h1:0+aNV/nrfoTQ4Mytv+Aw+stBDBjNf4d8fYRA9herfJI= cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= +cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= +cloud.google.com/go/osconfig v1.12.0/go.mod h1:8f/PaYzoS3JMVfdfTubkowZYGmAhUCjjwnjqWI7NVBc= +cloud.google.com/go/osconfig v1.12.1/go.mod h1:4CjBxND0gswz2gfYRCUoUzCm9zCABp91EeTtWXyz0tE= +cloud.google.com/go/osconfig v1.12.2/go.mod h1:eh9GPaMZpI6mEJEuhEjUJmaxvQ3gav+fFEJon1Y8Iw0= +cloud.google.com/go/osconfig v1.12.3/go.mod h1:L/fPS8LL6bEYUi1au832WtMnPeQNT94Zo3FwwV1/xGM= +cloud.google.com/go/osconfig v1.12.4/go.mod h1:B1qEwJ/jzqSRslvdOCI8Kdnp0gSng0xW4LOnIebQomA= cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= +cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= +cloud.google.com/go/oslogin v1.10.1/go.mod h1:x692z7yAue5nE7CsSnoG0aaMbNoRJRXO4sn73R+ZqAs= +cloud.google.com/go/oslogin v1.11.0/go.mod h1:8GMTJs4X2nOAUVJiPGqIWVcDaF0eniEto3xlOxaboXE= +cloud.google.com/go/oslogin v1.11.1/go.mod h1:OhD2icArCVNUxKqtK0mcSmKL7lgr0LVlQz+v9s1ujTg= +cloud.google.com/go/oslogin v1.12.1/go.mod h1:VfwTeFJGbnakxAY236eN8fsnglLiVXndlbcNomY4iZU= +cloud.google.com/go/oslogin v1.12.2/go.mod h1:CQ3V8Jvw4Qo4WRhNPF0o+HAM4DiLuE27Ul9CX9g2QdY= cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= +cloud.google.com/go/phishingprotection v0.8.1/go.mod h1:AxonW7GovcA8qdEk13NfHq9hNx5KPtfxXNeUxTDxB6I= +cloud.google.com/go/phishingprotection v0.8.2/go.mod h1:LhJ91uyVHEYKSKcMGhOa14zMMWfbEdxG032oT6ECbC8= +cloud.google.com/go/phishingprotection v0.8.3/go.mod h1:3B01yO7T2Ra/TMojifn8EoGd4G9jts/6cIO0DgDY9J8= +cloud.google.com/go/phishingprotection v0.8.4/go.mod h1:6b3kNPAc2AQ6jZfFHioZKg9MQNybDg4ixFd4RPZZ2nE= cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= +cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= +cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= +cloud.google.com/go/policytroubleshooter v1.7.1/go.mod h1:0NaT5v3Ag1M7U5r0GfDCpUFkWd9YqpubBWsQlhanRv0= +cloud.google.com/go/policytroubleshooter v1.8.0/go.mod h1:tmn5Ir5EToWe384EuboTcVQT7nTag2+DuH3uHmKd1HU= +cloud.google.com/go/policytroubleshooter v1.9.0/go.mod h1:+E2Lga7TycpeSTj2FsH4oXxTnrbHJGRlKhVZBLGgU64= +cloud.google.com/go/policytroubleshooter v1.9.1/go.mod h1:MYI8i0bCrL8cW+VHN1PoiBTyNZTstCg2WUw2eVC4c4U= +cloud.google.com/go/policytroubleshooter v1.10.1/go.mod h1:5C0rhT3TDZVxAu8813bwmTvd57Phbl8mr9F4ipOsxEs= +cloud.google.com/go/policytroubleshooter v1.10.2/go.mod h1:m4uF3f6LseVEnMV6nknlN2vYGRb+75ylQwJdnOXfnv0= cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= +cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= +cloud.google.com/go/privatecatalog v0.9.1/go.mod h1:0XlDXW2unJXdf9zFz968Hp35gl/bhF4twwpXZAW50JA= +cloud.google.com/go/privatecatalog v0.9.2/go.mod h1:RMA4ATa8IXfzvjrhhK8J6H4wwcztab+oZph3c6WmtFc= +cloud.google.com/go/privatecatalog v0.9.3/go.mod h1:K5pn2GrVmOPjXz3T26mzwXLcKivfIJ9R5N79AFCF9UE= +cloud.google.com/go/privatecatalog v0.9.4/go.mod h1:SOjm93f+5hp/U3PqMZAHTtBtluqLygrDrVO8X8tYtG0= +cloud.google.com/go/profiler v0.3.1/go.mod h1:GsG14VnmcMFQ9b+kq71wh3EKMZr3WRMgLzNiFRpW7tE= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -302,68 +878,185 @@ cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjp cloud.google.com/go/pubsub v1.5.0/go.mod h1:ZEwJccE3z93Z2HWvstpri00jOg7oO4UZDtKhwDwqF0w= cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= +cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= +cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= +cloud.google.com/go/pubsub v1.32.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= +cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= +cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= +cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= +cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= +cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.2/go.mod h1:kR0KjsJS7Jt1YSyWFkseQ756D45kaYNTlDPPaRAvDBU= +cloud.google.com/go/recaptchaenterprise/v2 v2.8.0/go.mod h1:QuE8EdU9dEnesG8/kG3XuJyNsjEqMlMzg3v3scCJ46c= +cloud.google.com/go/recaptchaenterprise/v2 v2.8.1/go.mod h1:JZYZJOeZjgSSTGP4uz7NlQ4/d1w5hGmksVgM0lbEij0= +cloud.google.com/go/recaptchaenterprise/v2 v2.8.2/go.mod h1:kpaDBOpkwD4G0GVMzG1W6Doy1tFFC97XAV3xy+Rd/pw= +cloud.google.com/go/recaptchaenterprise/v2 v2.8.3/go.mod h1:Dak54rw6lC2gBY8FBznpOCAR58wKf+R+ZSJRoeJok4w= +cloud.google.com/go/recaptchaenterprise/v2 v2.8.4/go.mod h1:Dak54rw6lC2gBY8FBznpOCAR58wKf+R+ZSJRoeJok4w= +cloud.google.com/go/recaptchaenterprise/v2 v2.9.0/go.mod h1:Dak54rw6lC2gBY8FBznpOCAR58wKf+R+ZSJRoeJok4w= cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= +cloud.google.com/go/recommendationengine v0.8.1/go.mod h1:MrZihWwtFYWDzE6Hz5nKcNz3gLizXVIDI/o3G1DLcrE= +cloud.google.com/go/recommendationengine v0.8.2/go.mod h1:QIybYHPK58qir9CV2ix/re/M//Ty10OxjnnhWdaKS1Y= +cloud.google.com/go/recommendationengine v0.8.3/go.mod h1:m3b0RZV02BnODE9FeSvGv1qibFo8g0OnmB/RMwYy4V8= +cloud.google.com/go/recommendationengine v0.8.4/go.mod h1:GEteCf1PATl5v5ZsQ60sTClUE0phbWmo3rQ1Js8louU= cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= +cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= +cloud.google.com/go/recommender v1.10.1/go.mod h1:XFvrE4Suqn5Cq0Lf+mCP6oBHD/yRMA8XxP5sb7Q7gpA= +cloud.google.com/go/recommender v1.11.0/go.mod h1:kPiRQhPyTJ9kyXPCG6u/dlPLbYfFlkwHNRwdzPVAoII= +cloud.google.com/go/recommender v1.11.1/go.mod h1:sGwFFAyI57v2Hc5LbIj+lTwXipGu9NW015rkaEM5B18= +cloud.google.com/go/recommender v1.11.2/go.mod h1:AeoJuzOvFR/emIcXdVFkspVXVTYpliRCmKNYDnyBv6Y= +cloud.google.com/go/recommender v1.11.3/go.mod h1:+FJosKKJSId1MBFeJ/TTyoGQZiEelQQIZMKYYD8ruK4= cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= +cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= +cloud.google.com/go/redis v1.13.1/go.mod h1:VP7DGLpE91M6bcsDdMuyCm2hIpB6Vp2hI090Mfd1tcg= +cloud.google.com/go/redis v1.13.2/go.mod h1:0Hg7pCMXS9uz02q+LoEVl5dNHUkIQv+C/3L76fandSA= +cloud.google.com/go/redis v1.13.3/go.mod h1:vbUpCKUAZSYzFcWKmICnYgRAhTFg9r+djWqFxDYXi4U= +cloud.google.com/go/redis v1.14.1/go.mod h1:MbmBxN8bEnQI4doZPC1BzADU4HGocHBk2de3SbgOkqs= cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= +cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= +cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= +cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= +cloud.google.com/go/resourcemanager v1.9.1/go.mod h1:dVCuosgrh1tINZ/RwBufr8lULmWGOkPS8gL5gqyjdT8= +cloud.google.com/go/resourcemanager v1.9.2/go.mod h1:OujkBg1UZg5lX2yIyMo5Vz9O5hf7XQOSV7WxqxxMtQE= +cloud.google.com/go/resourcemanager v1.9.3/go.mod h1:IqrY+g0ZgLsihcfcmqSe+RKp1hzjXwG904B92AwBz6U= +cloud.google.com/go/resourcemanager v1.9.4/go.mod h1:N1dhP9RFvo3lUfwtfLWVxfUWq8+KUQ+XLlHLH3BoFJ0= cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= +cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= +cloud.google.com/go/resourcesettings v1.6.1/go.mod h1:M7mk9PIZrC5Fgsu1kZJci6mpgN8o0IUzVx3eJU3y4Jw= +cloud.google.com/go/resourcesettings v1.6.2/go.mod h1:mJIEDd9MobzunWMeniaMp6tzg4I2GvD3TTmPkc8vBXk= +cloud.google.com/go/resourcesettings v1.6.3/go.mod h1:pno5D+7oDYkMWZ5BpPsb4SO0ewg3IXcmmrUZaMJrFic= +cloud.google.com/go/resourcesettings v1.6.4/go.mod h1:pYTTkWdv2lmQcjsthbZLNBP4QW140cs7wqA3DuqErVI= cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= +cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= +cloud.google.com/go/retail v1.14.1/go.mod h1:y3Wv3Vr2k54dLNIrCzenyKG8g8dhvhncT2NcNjb/6gE= +cloud.google.com/go/retail v1.14.2/go.mod h1:W7rrNRChAEChX336QF7bnMxbsjugcOCPU44i5kbLiL8= +cloud.google.com/go/retail v1.14.3/go.mod h1:Omz2akDHeSlfCq8ArPKiBxlnRpKEBjUH386JYFLUvXo= +cloud.google.com/go/retail v1.14.4/go.mod h1:l/N7cMtY78yRnJqp5JW8emy7MB1nz8E4t2yfOmklYfg= cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= +cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= +cloud.google.com/go/run v1.2.0/go.mod h1:36V1IlDzQ0XxbQjUx6IYbw8H3TJnWvhii963WW3B/bo= +cloud.google.com/go/run v1.3.0/go.mod h1:S/osX/4jIPZGg+ssuqh6GNgg7syixKe3YnprwehzHKU= +cloud.google.com/go/run v1.3.1/go.mod h1:cymddtZOzdwLIAsmS6s+Asl4JoXIDm/K1cpZTxV4Q5s= +cloud.google.com/go/run v1.3.2/go.mod h1:SIhmqArbjdU/D9M6JoHaAqnAMKLFtXaVdNeq04NjnVE= +cloud.google.com/go/run v1.3.3/go.mod h1:WSM5pGyJ7cfYyYbONVQBN4buz42zFqwG67Q3ch07iK4= cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= +cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= +cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= +cloud.google.com/go/scheduler v1.10.1/go.mod h1:R63Ldltd47Bs4gnhQkmNDse5w8gBRrhObZ54PxgR2Oo= +cloud.google.com/go/scheduler v1.10.2/go.mod h1:O3jX6HRH5eKCA3FutMw375XHZJudNIKVonSCHv7ropY= +cloud.google.com/go/scheduler v1.10.3/go.mod h1:8ANskEM33+sIbpJ+R4xRfw/jzOG+ZFE8WVLy7/yGvbc= +cloud.google.com/go/scheduler v1.10.4/go.mod h1:MTuXcrJC9tqOHhixdbHDFSIuh7xZF2IysiINDuiq6NI= +cloud.google.com/go/scheduler v1.10.5/go.mod h1:MTuXcrJC9tqOHhixdbHDFSIuh7xZF2IysiINDuiq6NI= cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= +cloud.google.com/go/secretmanager v1.11.1/go.mod h1:znq9JlXgTNdBeQk9TBW/FnR/W4uChEKGeqQWAJ8SXFw= +cloud.google.com/go/secretmanager v1.11.2/go.mod h1:MQm4t3deoSub7+WNwiC4/tRYgDBHJgJPvswqQVB1Vss= +cloud.google.com/go/secretmanager v1.11.3/go.mod h1:0bA2o6FabmShrEy328i67aV+65XoUFFSmVeLBn/51jI= +cloud.google.com/go/secretmanager v1.11.4/go.mod h1:wreJlbS9Zdq21lMzWmJ0XhWW2ZxgPeahsqeV/vZoJ3w= cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= +cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= +cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= +cloud.google.com/go/security v1.15.1/go.mod h1:MvTnnbsWnehoizHi09zoiZob0iCHVcL4AUBj76h9fXA= +cloud.google.com/go/security v1.15.2/go.mod h1:2GVE/v1oixIRHDaClVbHuPcZwAqFM28mXuAKCfMgYIg= +cloud.google.com/go/security v1.15.3/go.mod h1:gQ/7Q2JYUZZgOzqKtw9McShH+MjNvtDpL40J1cT+vBs= +cloud.google.com/go/security v1.15.4/go.mod h1:oN7C2uIZKhxCLiAAijKUCuHLZbIt/ghYEo8MqwD/Ty4= cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= +cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= +cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= +cloud.google.com/go/securitycenter v1.23.0/go.mod h1:8pwQ4n+Y9WCWM278R8W3nF65QtY172h4S8aXyI9/hsQ= +cloud.google.com/go/securitycenter v1.23.1/go.mod h1:w2HV3Mv/yKhbXKwOCu2i8bCuLtNP1IMHuiYQn4HJq5s= +cloud.google.com/go/securitycenter v1.24.1/go.mod h1:3h9IdjjHhVMXdQnmqzVnM7b0wMn/1O/U20eWVpMpZjI= +cloud.google.com/go/securitycenter v1.24.2/go.mod h1:l1XejOngggzqwr4Fa2Cn+iWZGf+aBLTXtB/vXjy5vXM= +cloud.google.com/go/securitycenter v1.24.3/go.mod h1:l1XejOngggzqwr4Fa2Cn+iWZGf+aBLTXtB/vXjy5vXM= cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= +cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= +cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= +cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= +cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= +cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= +cloud.google.com/go/servicedirectory v1.10.1/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= +cloud.google.com/go/servicedirectory v1.11.0/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= +cloud.google.com/go/servicedirectory v1.11.1/go.mod h1:tJywXimEWzNzw9FvtNjsQxxJ3/41jseeILgwU/QLrGI= +cloud.google.com/go/servicedirectory v1.11.2/go.mod h1:KD9hCLhncWRV5jJphwIpugKwM5bn1x0GyVVD4NO8mGg= +cloud.google.com/go/servicedirectory v1.11.3/go.mod h1:LV+cHkomRLr67YoQy3Xq2tUXBGOs5z5bPofdq7qtiAw= cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= +cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= +cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= +cloud.google.com/go/shell v1.7.1/go.mod h1:u1RaM+huXFaTojTbW4g9P5emOrrmLE69KrxqQahKn4g= +cloud.google.com/go/shell v1.7.2/go.mod h1:KqRPKwBV0UyLickMn0+BY1qIyE98kKyI216sH/TuHmc= +cloud.google.com/go/shell v1.7.3/go.mod h1:cTTEz/JdaBsQAeTQ3B6HHldZudFoYBOqjteev07FbIc= +cloud.google.com/go/shell v1.7.4/go.mod h1:yLeXB8eKLxw0dpEmXQ/FjriYrBijNsONpwnWsdPqlKM= cloud.google.com/go/spanner v1.5.1/go.mod h1:e1+8M6PF3ntV9Xr57X2Gf+UhylXXYF6gI4WRZ1kfu2A= cloud.google.com/go/spanner v1.7.0/go.mod h1:sd3K2gZ9Fd0vMPLXzeCrF6fq4i63Q7aTLW/lBIfBkIk= cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= +cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= +cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= +cloud.google.com/go/spanner v1.45.1/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= +cloud.google.com/go/spanner v1.47.0/go.mod h1:IXsJwVW2j4UKs0eYDqodab6HgGuA1bViSqW4uH9lfUI= +cloud.google.com/go/spanner v1.49.0/go.mod h1:eGj9mQGK8+hkgSVbHNQ06pQ4oS+cyc4tXXd6Dif1KoM= +cloud.google.com/go/spanner v1.50.0/go.mod h1:eGj9mQGK8+hkgSVbHNQ06pQ4oS+cyc4tXXd6Dif1KoM= +cloud.google.com/go/spanner v1.51.0/go.mod h1:c5KNo5LQ1X5tJwma9rSQZsXNBDNvj4/n8BVc3LNahq0= +cloud.google.com/go/spanner v1.53.0/go.mod h1:liG4iCeLqm5L3fFLU5whFITqP0e0orsAW1uUSrd4rws= +cloud.google.com/go/spanner v1.53.1/go.mod h1:liG4iCeLqm5L3fFLU5whFITqP0e0orsAW1uUSrd4rws= cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= +cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= +cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= +cloud.google.com/go/speech v1.17.1/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= +cloud.google.com/go/speech v1.19.0/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= +cloud.google.com/go/speech v1.19.1/go.mod h1:WcuaWz/3hOlzPFOVo9DUsblMIHwxP589y6ZMtaG+iAA= +cloud.google.com/go/speech v1.19.2/go.mod h1:2OYFfj+Ch5LWjsaSINuCZsre/789zlcCI3SY4oAi2oI= +cloud.google.com/go/speech v1.20.1/go.mod h1:wwolycgONvfz2EDU8rKuHRW3+wc9ILPsAWoikBEWavY= +cloud.google.com/go/speech v1.21.0/go.mod h1:wwolycgONvfz2EDU8rKuHRW3+wc9ILPsAWoikBEWavY= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.3.0/go.mod h1:9IAwXhoyBJ7z9LcAwkj0/7NnPzYaPeZxxVp3zm+5IqA= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= @@ -375,50 +1068,147 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= +cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= cloud.google.com/go/storage v1.38.0 h1:Az68ZRGlnNTpIBbLjSMIV2BDcwwXYlRlQzis0llkpJg= cloud.google.com/go/storage v1.38.0/go.mod h1:tlUADB0mAb9BgYls9lq+8MGkfzOXuLrnHXlpHmvFJoY= cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= +cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= +cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= +cloud.google.com/go/storagetransfer v1.10.0/go.mod h1:DM4sTlSmGiNczmV6iZyceIh2dbs+7z2Ayg6YAiQlYfA= +cloud.google.com/go/storagetransfer v1.10.1/go.mod h1:rS7Sy0BtPviWYTTJVWCSV4QrbBitgPeuK4/FKa4IdLs= +cloud.google.com/go/storagetransfer v1.10.2/go.mod h1:meIhYQup5rg9juQJdyppnA/WLQCOguxtk1pr3/vBWzA= +cloud.google.com/go/storagetransfer v1.10.3/go.mod h1:Up8LY2p6X68SZ+WToswpQbQHnJpOty/ACcMafuey8gc= cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= +cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= +cloud.google.com/go/talent v1.6.2/go.mod h1:CbGvmKCG61mkdjcqTcLOkb2ZN1SrQI8MDyma2l7VD24= +cloud.google.com/go/talent v1.6.3/go.mod h1:xoDO97Qd4AK43rGjJvyBHMskiEf3KulgYzcH6YWOVoo= +cloud.google.com/go/talent v1.6.4/go.mod h1:QsWvi5eKeh6gG2DlBkpMaFYZYrYUnIpo34f6/V5QykY= +cloud.google.com/go/talent v1.6.5/go.mod h1:Mf5cma696HmE+P2BWJ/ZwYqeJXEeU0UqjHFXVLadEDI= cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= +cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= +cloud.google.com/go/texttospeech v1.7.1/go.mod h1:m7QfG5IXxeneGqTapXNxv2ItxP/FS0hCZBwXYqucgSk= +cloud.google.com/go/texttospeech v1.7.2/go.mod h1:VYPT6aTOEl3herQjFHYErTlSZJ4vB00Q2ZTmuVgluD4= +cloud.google.com/go/texttospeech v1.7.3/go.mod h1:Av/zpkcgWfXlDLRYob17lqMstGZ3GqlvJXqKMp2u8so= +cloud.google.com/go/texttospeech v1.7.4/go.mod h1:vgv0002WvR4liGuSd5BJbWy4nDn5Ozco0uJymY5+U74= cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= +cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= +cloud.google.com/go/tpu v1.6.1/go.mod h1:sOdcHVIgDEEOKuqUoi6Fq53MKHJAtOwtz0GuKsWSH3E= +cloud.google.com/go/tpu v1.6.2/go.mod h1:NXh3NDwt71TsPZdtGWgAG5ThDfGd32X1mJ2cMaRlVgU= +cloud.google.com/go/tpu v1.6.3/go.mod h1:lxiueqfVMlSToZY1151IaZqp89ELPSrk+3HIQ5HRkbY= +cloud.google.com/go/tpu v1.6.4/go.mod h1:NAm9q3Rq2wIlGnOhpYICNI7+bpBebMJbh0yyp3aNw1Y= +cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= +cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= +cloud.google.com/go/trace v1.10.1/go.mod h1:gbtL94KE5AJLH3y+WVpfWILmqgc6dXcqgNXdOPAQTYk= +cloud.google.com/go/trace v1.10.2/go.mod h1:NPXemMi6MToRFcSxRl2uDnu/qAlAQ3oULUphcHGh1vA= +cloud.google.com/go/trace v1.10.3/go.mod h1:Ke1bgfc73RV3wUFml+uQp7EsDw4dGaETLxB7Iq/r4CY= +cloud.google.com/go/trace v1.10.4/go.mod h1:Nso99EDIK8Mj5/zmB+iGr9dosS/bzWCJ8wGmE6TXNWY= cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= +cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= +cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.8.1/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= +cloud.google.com/go/translate v1.8.2/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= +cloud.google.com/go/translate v1.9.0/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= +cloud.google.com/go/translate v1.9.1/go.mod h1:TWIgDZknq2+JD4iRcojgeDtqGEp154HN/uL6hMvylS8= +cloud.google.com/go/translate v1.9.2/go.mod h1:E3Tc6rUTsQkVrXW6avbUhKJSr7ZE3j7zNmqzXKHqRrY= +cloud.google.com/go/translate v1.9.3/go.mod h1:Kbq9RggWsbqZ9W5YpM94Q1Xv4dshw/gr/SHfsl5yCZ0= cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= +cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= +cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= +cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.17.1/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= +cloud.google.com/go/video v1.19.0/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= +cloud.google.com/go/video v1.20.0/go.mod h1:U3G3FTnsvAGqglq9LxgqzOiBc/Nt8zis8S+850N2DUM= +cloud.google.com/go/video v1.20.1/go.mod h1:3gJS+iDprnj8SY6pe0SwLeC5BUW80NjhwX7INWEuWGU= +cloud.google.com/go/video v1.20.2/go.mod h1:lrixr5JeKNThsgfM9gqtwb6Okuqzfo4VrY2xynaViTA= +cloud.google.com/go/video v1.20.3/go.mod h1:TnH/mNZKVHeNtpamsSPygSR0iHtvrR/cW1/GDjN5+GU= cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= +cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= +cloud.google.com/go/videointelligence v1.11.1/go.mod h1:76xn/8InyQHarjTWsBR058SmlPCwQjgcvoW0aZykOvo= +cloud.google.com/go/videointelligence v1.11.2/go.mod h1:ocfIGYtIVmIcWk1DsSGOoDiXca4vaZQII1C85qtoplc= +cloud.google.com/go/videointelligence v1.11.3/go.mod h1:tf0NUaGTjU1iS2KEkGWvO5hRHeCkFK3nPo0/cOZhZAo= +cloud.google.com/go/videointelligence v1.11.4/go.mod h1:kPBMAYsTPFiQxMLmmjpcZUMklJp3nC9+ipJJtprccD8= cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= +cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= +cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= +cloud.google.com/go/vision/v2 v2.7.2/go.mod h1:jKa8oSYBWhYiXarHPvP4USxYANYUEdEsQrloLjrSwJU= +cloud.google.com/go/vision/v2 v2.7.3/go.mod h1:V0IcLCY7W+hpMKXK1JYE0LV5llEqVmj+UJChjvA1WsM= +cloud.google.com/go/vision/v2 v2.7.4/go.mod h1:ynDKnsDN/0RtqkKxQZ2iatv3Dm9O+HfRb5djl7l4Vvw= +cloud.google.com/go/vision/v2 v2.7.5/go.mod h1:GcviprJLFfK9OLf0z8Gm6lQb6ZFUulvpZws+mm6yPLM= cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= +cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= +cloud.google.com/go/vmmigration v1.7.1/go.mod h1:WD+5z7a/IpZ5bKK//YmT9E047AD+rjycCAvyMxGJbro= +cloud.google.com/go/vmmigration v1.7.2/go.mod h1:iA2hVj22sm2LLYXGPT1pB63mXHhrH1m/ruux9TwWLd8= +cloud.google.com/go/vmmigration v1.7.3/go.mod h1:ZCQC7cENwmSWlwyTrZcWivchn78YnFniEQYRWQ65tBo= +cloud.google.com/go/vmmigration v1.7.4/go.mod h1:yBXCmiLaB99hEl/G9ZooNx2GyzgsjKnw5fWcINRgD70= +cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= +cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= +cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= +cloud.google.com/go/vmwareengine v0.4.1/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= +cloud.google.com/go/vmwareengine v1.0.0/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= +cloud.google.com/go/vmwareengine v1.0.1/go.mod h1:aT3Xsm5sNx0QShk1Jc1B8OddrxAScYLwzVoaiXfdzzk= +cloud.google.com/go/vmwareengine v1.0.2/go.mod h1:xMSNjIk8/itYrz1JA8nV3Ajg4L4n3N+ugP8JKzk3OaA= +cloud.google.com/go/vmwareengine v1.0.3/go.mod h1:QSpdZ1stlbfKtyt6Iu19M6XRxjmXO+vb5a/R6Fvy2y4= cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= +cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= +cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2tArQwLY4SXs= +cloud.google.com/go/vpcaccess v1.7.2/go.mod h1:mmg/MnRHv+3e8FJUjeSibVFvQF1cCy2MsFaFqxeY1HU= +cloud.google.com/go/vpcaccess v1.7.3/go.mod h1:YX4skyfW3NC8vI3Fk+EegJnlYFatA+dXK4o236EUCUc= +cloud.google.com/go/vpcaccess v1.7.4/go.mod h1:lA0KTvhtEOb/VOdnH/gwPuOzGgM+CWsmGu6bb4IoMKk= cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= +cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= +cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= +cloud.google.com/go/webrisk v1.9.2/go.mod h1:pY9kfDgAqxUpDBOrG4w8deLfhvJmejKB0qd/5uQIPBc= +cloud.google.com/go/webrisk v1.9.3/go.mod h1:RUYXe9X/wBDXhVilss7EDLW9ZNa06aowPuinUOPCXH8= +cloud.google.com/go/webrisk v1.9.4/go.mod h1:w7m4Ib4C+OseSr2GL66m0zMBywdrVNTDKsdEsfMl7X0= cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= +cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= +cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= +cloud.google.com/go/websecurityscanner v1.6.2/go.mod h1:7YgjuU5tun7Eg2kpKgGnDuEOXWIrh8x8lWrJT4zfmas= +cloud.google.com/go/websecurityscanner v1.6.3/go.mod h1:x9XANObUFR+83Cya3g/B9M/yoHVqzxPnFtgF8yYGAXw= +cloud.google.com/go/websecurityscanner v1.6.4/go.mod h1:mUiyMQ+dGpPPRkHgknIZeCzSHJ45+fY4F52nZFDHm2o= cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= +cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= +cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= +cloud.google.com/go/workflows v1.12.0/go.mod h1:PYhSk2b6DhZ508tj8HXKaBh+OFe+xdl0dHF/tJdzPQM= +cloud.google.com/go/workflows v1.12.1/go.mod h1:5A95OhD/edtOhQd/O741NSfIMezNTbCwLM1P1tBRGHM= +cloud.google.com/go/workflows v1.12.2/go.mod h1:+OmBIgNqYJPVggnMo9nqmizW0qEXHhmnAzK/CnBqsHc= +cloud.google.com/go/workflows v1.12.3/go.mod h1:fmOUeeqEwPzIU81foMjTRQIdwQHADi/vEr1cx9R1m5g= code.cloudfoundry.org/gofileutils v0.0.0-20170111115228-4d0c80011a0f/go.mod h1:sk5LnIjB/nIEU7yP5sDQExVm62wu0pBh3yrElngUisI= +code.gitea.io/sdk/gitea v0.14.0/go.mod h1:89WiyOX1KEcvjP66sRHdu0RafojGo60bT9UqW17VbWs= +code.gitea.io/sdk/gitea v0.16.0/go.mod h1:ndkDk99BnfiUCCYEUhpNzi0lpmApXlwRFqClBlOlEBg= contrib.go.opencensus.io/exporter/aws v0.0.0-20181029163544-2befc13012d0/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= -contrib.go.opencensus.io/exporter/ocagent v0.4.12/go.mod h1:450APlNTSR6FrvC3CTRqYosuDstRB9un7SOx2k/9ckA= contrib.go.opencensus.io/exporter/ocagent v0.6.0/go.mod h1:zmKjrJcdo0aYcVS7bmEeSEBLPA9YJp5bjrofdU3pIXs= contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d h1:LblfooH1lKOpp1hIhukktmSAxFkqMPFk9KR6iZ0MJNI= contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d/go.mod h1:IshRmMJBhDfFj5Y67nVhMYTTIze91RUeT73ipWKs/GY= @@ -428,17 +1218,27 @@ contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0 contrib.go.opencensus.io/exporter/stackdriver v0.12.1/go.mod h1:iwB6wGarfphGGe/e5CWqyUk/cLzKnWsOKPVW3no6OTw= contrib.go.opencensus.io/exporter/stackdriver v0.12.8/go.mod h1:XyyafDnFOsqoxHJgTFycKZMrRUrPThLh2iYTJF6uoO0= contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= +contrib.go.opencensus.io/exporter/stackdriver v0.13.14/go.mod h1:5pSSGY0Bhuk7waTHuDf4aQ8D2DrhgETRo9fy6k3Xlzc= +contrib.go.opencensus.io/exporter/zipkin v0.1.2/go.mod h1:mP5xM3rrgOjpn79MM8fZbj3gsxcuytSqtH0dxSWW1RE= contrib.go.opencensus.io/integrations/ocsql v0.1.4/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= contrib.go.opencensus.io/resource v0.1.1/go.mod h1:F361eGI91LCmW1I/Saf+rX0+OFcigGlFvXwEGEnkRLA= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= dmitri.shuralyov.com/gpu/mtl v0.0.0-20201218220906-28db891af037/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= emperror.dev/errors v0.8.0/go.mod h1:YcRvLPh626Ubn2xqtoprejnA5nFha+TJ+2vew48kWuE= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= git.apache.org/thrift.git v0.12.0/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +git.sr.ht/~nelsam/hel v0.4.2/go.mod h1:6M8gpa/CGGNtFNlLN9odbQ0MzUQ2ZA8bWemVS8kTf5o= +git.sr.ht/~nelsam/hel v0.4.3/go.mod h1:SP6fXSPxdmd7aOGMTSf8/EMLLCT438LHnZHN66nZqo0= +git.sr.ht/~nelsam/hel/v4 v4.1.0/go.mod h1:OrTLOFJGT6G/t9q8WZy+NPOvmYUobdFZP59lpf+TrOg= +git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= github.com/Abirdcfly/dupword v0.0.7/go.mod h1:K/4M1kj+Zh39d2aotRwypvasonOyAMH1c/IZJzE0dmk= github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20221206110420-d395f97c4830/go.mod h1:VzwV+t+dZ9j/H867F1M2ziD+yLHtB46oM35FxxMJ4d0= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= +github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0/go.mod h1:OahwfttHWG6eJ0clwcfBAHoDI6X/LV/15hx/wlMZSrU= github.com/Antonboom/errname v0.1.7/go.mod h1:g0ONh16msHIPgJSGsecu1G/dcF2hlYR/0SddnIAGavU= github.com/Antonboom/nilnil v0.1.1/go.mod h1:L1jBqoWM7AOeTD+tSquifKSesRHs4ZdaxvZR+xdJEaI= github.com/Azure/azure-amqp-common-go/v3 v3.0.0/go.mod h1:SY08giD/XbhTz07tJdpw1SoxQXHPN30+DI3Z04SYqyg= @@ -450,14 +1250,21 @@ github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl github.com/Azure/azure-sdk-for-go v43.0.0+incompatible h1:/wSNCu0e6EsHFR4Qa3vBEBbicaprEHMyyga9g8RTULI= github.com/Azure/azure-sdk-for-go v43.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0/go.mod h1:3Ug6Qzto9anB6mGlEdgYMDF5zHQ+wwhEaYR4s17PHMw= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1 h1:lGlwhPtrX6EVml1hO0ivjkUxsSyl4dsiw9qcA1k/3IQ= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1/go.mod h1:RKUqNu35KJYcVG/fqTRqmuXJZYNhYkBrnC/hX7yGbTA= github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1/go.mod h1:uE9zaUfEQT/nbQjVi2IblCG9iaLtZsuYZ8ne+PuQ02M= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 h1:BMAjVKJM0U/CYF27gA0ZMmXGkOcvfFtD0oHVZ1TIPRI= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0/go.mod h1:1fXstnBMas5kzG+S3q8UoJcmyU6nUeunJcMDHcRYHhs= github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1 h1:6oNBlSdi1QqM1PNW7FPA6xOGA5UNsXnkaYZz9vdPGhA= github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1/go.mod h1:s4kgfzA0covAXNicZHDMN58jExvcng2mC/DepXiF1EI= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1/go.mod h1:GpPjLhVR9dnUoJMyHWSPy71xY9/lcmpzIPZXmF0FCVY= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0/go.mod h1:bTSOgj05NGRuHHhQwAdPnYr9TOdNmKlZTgGLL6nyAdI= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0 h1:u/LLAOFgsMv7HmNL4Qufg58y+qElGOt5qv0z1mURkRY= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0/go.mod h1:2e8rMJtl2+2j+HXbTBwnyGpm5Nou7KhvSfxOq8JpTag= github.com/Azure/azure-service-bus-go v0.10.1/go.mod h1:E/FOceuKAFUfpbIJDKWz/May6guE+eGibfGT6q+n1to= @@ -479,9 +1286,12 @@ github.com/Azure/go-autorest/autorest v0.11.0/go.mod h1:JFgpikqFJ/MleTTxwepExTKn github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= github.com/Azure/go-autorest/autorest v0.11.13/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= github.com/Azure/go-autorest/autorest v0.11.17/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= github.com/Azure/go-autorest/autorest v0.11.21/go.mod h1:Do/yuMSW/13ayUkcVREpsMHGG+MvV81uzSCFgYPj4tM= github.com/Azure/go-autorest/autorest v0.11.24/go.mod h1:G6kyRlFnTuSbEYkQGawPfsCswgme4iYf6rfSKUDzbCc= +github.com/Azure/go-autorest/autorest v0.11.25/go.mod h1:7l8ybrIdUmGqZMTD0sRtAr8NvbHjfofbf8RSP2q7w7U= github.com/Azure/go-autorest/autorest v0.11.27/go.mod h1:7l8ybrIdUmGqZMTD0sRtAr8NvbHjfofbf8RSP2q7w7U= +github.com/Azure/go-autorest/autorest v0.11.28/go.mod h1:MrkzG3Y3AH668QyF9KRk5neJnGgmhQ6krbhR8Q5eMvA= github.com/Azure/go-autorest/autorest v0.11.29 h1:I4+HL/JDvErx2LjyzaVxllw2lRDB5/BT2Bm4g20iqYw= github.com/Azure/go-autorest/autorest v0.11.29/go.mod h1:ZtEzC4Jy2JDrZLxvWs8LrBWEBycl1hbT1eknI8MtfAs= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= @@ -495,9 +1305,11 @@ github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQW github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= github.com/Azure/go-autorest/autorest/adal v0.9.8/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= github.com/Azure/go-autorest/autorest/adal v0.9.11/go.mod h1:nBKAnTomx8gDtl+3ZCJv2v0KACFHWTB2drffI1B68Pk= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= github.com/Azure/go-autorest/autorest/adal v0.9.20/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= +github.com/Azure/go-autorest/autorest/adal v0.9.21/go.mod h1:zua7mBUaCc5YnSLKYgGJR/w5ePdMDA6H56upLsHzA9U= github.com/Azure/go-autorest/autorest/adal v0.9.22/go.mod h1:XuAbAEUv2Tta//+voMI038TrJBqjKam0me7qR+L8Cmk= github.com/Azure/go-autorest/autorest/adal v0.9.23 h1:Yepx8CvFxwNKpH6ja7RZ+sKX+DWYNldbLiALMC3BTz8= github.com/Azure/go-autorest/autorest/adal v0.9.23/go.mod h1:5pcMqFkdPhviJdlEy3kC/v1ZLnQl0MH6XA5YCcMhy4c= @@ -559,6 +1371,7 @@ github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.4.4/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20191009163259-e802c2cb94ae/go.mod h1:mjwGPas4yKduTyubHvD1Atl9r1rUq8DfVy+gkVvZ+oo= @@ -566,6 +1379,8 @@ github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190612171043-2e19bb35 github.com/GoogleCloudPlatform/k8s-cloud-provider v1.18.1-0.20220218231025-f11817397a1b h1:Heo1J/ttaQFgGJSVnCZquy3e5eH5j1nqxBuomztB3P0= github.com/GoogleCloudPlatform/k8s-cloud-provider v1.18.1-0.20220218231025-f11817397a1b/go.mod h1:FNj4KYEAAHfYu68kRYolGoxkaJn+6mdEsaM12VTwuI0= github.com/GoogleCloudPlatform/testgrid v0.0.1-alpha.3/go.mod h1:f96W2HYy3tiBNV5zbbRc+NczwYHgG1PHXMQfoEWv680= +github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/IBM-Cloud/bluemix-go v0.0.0-20220329045155-d2a8118ac5c7/go.mod h1:UOhxo7T8CdX6sdTY9Dn7rJSgyoTlz1KM9641XcPraH0= github.com/IBM-Cloud/bluemix-go v0.0.0-20230120122421-afb48116b8f1/go.mod h1:cO5KCpiop9eP/pM/5W07TprYUkv/kHtajW1FiZgE59k= github.com/IBM-Cloud/bluemix-go v0.0.0-20240226130409-ce92adb39a22 h1:bmLx8w2wQB97Dm5pNeQKIjOGjASvRa+cPP8QZCrL+Xo= @@ -580,6 +1395,7 @@ github.com/IBM/vpc-go-sdk v0.48.0 h1:4yeSxVX9mizsIW2F0rsVI47rZoNKBrZ1QK9RwwRas9Q github.com/IBM/vpc-go-sdk v0.48.0/go.mod h1:FDJpiokOmaYG2hNYDfqKVxUPe8mm/dPi3mdz8Zt4o/Q= github.com/JeffAshton/win_pdh v0.0.0-20161109143554-76bb4ee9f0ab/go.mod h1:3VYc5hodBMJ5+l/7J4xAyMeuM2PNuepvHlGs8yilUCA= github.com/Jeffail/gabs v1.1.1/go.mod h1:6xMvQMK4k33lb7GUUpaAPh6nKMmemQeg5d4gn7/bOXc= +github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/LINBIT/golinstor v0.27.0 h1:f5Uf9gQgI6EEVA8eaKgRe8hDrYHN9e18CUZ5Eybuimw= github.com/LINBIT/golinstor v0.27.0/go.mod h1:p2V1Y5ppce3isjO7IBiZGOwY8R8oIm+nYZqOa77bpXM= @@ -613,6 +1429,7 @@ github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOp github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= +github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= @@ -631,6 +1448,10 @@ github.com/Microsoft/hcsshim v0.8.24/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01 github.com/Microsoft/hcsshim v0.9.0/go.mod h1:VBJWdC71NSWPlEo7lwde1aL21748J8B6Sdgno7NqEGE= github.com/Microsoft/hcsshim v0.9.2/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= github.com/Microsoft/hcsshim v0.9.3/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= +github.com/Microsoft/hcsshim v0.9.4/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= +github.com/Microsoft/hcsshim v0.9.6/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= +github.com/Microsoft/hcsshim v0.9.7/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= +github.com/Microsoft/hcsshim v0.9.10/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8= github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w= github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= @@ -639,37 +1460,49 @@ github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb0 github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/OneOfOne/xxhash v1.2.5/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= github.com/OneOfOne/xxhash v1.2.6/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= +github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= github.com/OpenPeeDeeP/depguard v1.1.1/go.mod h1:JtAMzWkmFEzDPyAd+W0NHl1lvpQKTvT9jnRVsohBKpc= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g= +github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/SAP/go-hdb v0.14.1/go.mod h1:7fdQLVC2lER3urZLjZCm0AuMQfApof92n3aylBPEkMo= github.com/Sectorbob/mlab-ns2 v0.0.0-20171030222938-d3aa0c295a8a/go.mod h1:D73UAuEPckrDorYZdtlCu2ySOLuPB5W4rhIkmmc/XbI= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/sarama v1.30.0/go.mod h1:zujlQQx1kzHsh4jfV1USnptCQrHAEZ2Hk8fTKCulPVs= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/Shopify/toxiproxy/v2 v2.1.6-0.20210914104332-15ea381dcdae/go.mod h1:/cvHQkZ1fst0EmZnA5dFtiQdWCNCFYzb+uE2vqVgvx0= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/StackExchange/wmi v0.0.0-20180725035823-b12b22c5341f/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/a8m/mark v0.1.1-0.20170507133748-44f2db618845/go.mod h1:c8Mh99Cw82nrsAnPgxQSZHkswVOJF7/MqZb1ZdvriLM= +github.com/a8m/expect v1.0.0/go.mod h1:4IwSCMumY49ScypDnjNbYEjgVeqy1/U2cEs3Lat96eA= github.com/abdullin/seq v0.0.0-20160510034733-d5467c17e7af/go.mod h1:5Jv4cbFiHJMsVxt52+i0Ha45fjshj6wxYr1r19tB9bw= +github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= github.com/aerospike/aerospike-client-go/v5 v5.6.0/go.mod h1:rJ/KpmClE7kiBPfvAPrGw9WuNOiz8v2uKbQaUyYPXtI= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= +github.com/ahmetb/gen-crd-api-reference-docs v0.3.1-0.20220720053627-e327d0730470/go.mod h1:TdjdkYhlOifCQWPs1UdTma97kQQMozf5h26hTuG70u8= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= +github.com/akavel/rsrc v0.10.2/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= +github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= +github.com/alecthomas/jsonschema v0.0.0-20180308105923-f2c93856175a/go.mod h1:qpebaTNSsyUn5rPSJMsfqEtDw71TTggXM6stUDI16HA= +github.com/alecthomas/kingpin/v2 v2.3.1/go.mod h1:oYL5vtsvEHZGHxU7DMp32Dvx+qL+ptGn6lWaot2vCNE= +github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= github.com/alexflint/go-filemutex v1.1.0/go.mod h1:7P4iRhttt/nUvUOrYIhcpMzv2G6CY9UnI16Z+UJqRyk= +github.com/alexflint/go-filemutex v1.2.0/go.mod h1:mYyQSWvw9Tx2/H2n9qXPb52tTYfE0pZAWcBq5mK025c= github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I= github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190412020505-60e2075261b6/go.mod h1:T9M45xf79ahXVelWoOBmH0y4aC1t5kXO5BxwyakgIGA= @@ -685,7 +1518,8 @@ github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHG github.com/andygrunwald/go-gerrit v0.0.0-20190120104749-174420ebee6c/go.mod h1:0iuRQp6WJ44ts+iihy5E/WlPqfg5RNeQxOmzRkxCdtk= github.com/andygrunwald/go-jira v1.15.0 h1:krX3Ad4i44mOG0u+vIxQLhLkyyQKPbTsOISsDRgBNjU= github.com/andygrunwald/go-jira v1.15.0/go.mod h1:GIYN1sHOIsENWUZ7B4pDeT/nxEtrZpE8l0987O67ZR8= -github.com/ant31/crd-validation v0.0.0-20180702145049-30f8a35d0ac2/go.mod h1:X0noFIik9YqfhGYBLEHg8LJKEwy7QIitLQuFMpKLcPk= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= @@ -693,9 +1527,17 @@ github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220418222510-f25a4f6275ed/go.m github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df h1:7RFfzj4SSt6nnvCPbCqijJi1nWCd+TqAT3bYCStRC18= github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM= github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= +github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= github.com/apache/arrow/go/arrow v0.0.0-20210818145353-234c94e4ce64/go.mod h1:2qMFB56yOP3KzkB3PbYZ4AlUFg3a88F67TIx5lB/WwY= +github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= +github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= +github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg= +github.com/apache/beam/sdks/v2 v2.47.0-RC3/go.mod h1:n8ybxT4OltLeoykTV8CGg/xQ1yrUJw13aJRkQY36lE8= +github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.14.2/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= github.com/apple/foundationdb/bindings/go v0.0.0-20190411004307-cd5c9d91fad2/go.mod h1:OMVSB21p9+xQUIqlGizHPZfjK+SHws1ht+ZytVDoz9U= github.com/aquilax/truncate v1.0.0 h1:UgIGS8U/aZ4JyOJ2h3xcF5cSQ06+gGBnjxH2RUHJe0U= github.com/aquilax/truncate v1.0.0/go.mod h1:BeMESIDMlvlS3bmg4BVvBbbZUNwWtS8uzYPAKXwwhLw= @@ -709,6 +1551,7 @@ github.com/armon/go-metrics v0.3.3/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4 github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= +github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-proxyproto v0.0.0-20190211145416-68259f75880e/go.mod h1:QmP9hvJ91BbJmGVGSbutW19IC0Q9phDCLGaomwTJbgU= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= @@ -728,7 +1571,6 @@ github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvx github.com/auth0/go-jwt-middleware v1.0.1/go.mod h1:YSeUX3z6+TF2H+7padiEqNJ73Zy9vXW72U//IgN0BIM= github.com/aws/aws-k8s-tester v0.0.0-20190114231546-b411acf57dfe/go.mod h1:1ADF5tAtU1/mVtfMcHAYSm2fPw71DA7fFk0yed64/0I= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= -github.com/aws/aws-sdk-go v0.0.0-20180507225419-00862f899353/go.mod h1:ZRmQr0FajVIyZ4ZzBYKG5P3ZqPz9IHG41ZoMu1ADI3k= github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.15.90/go.mod h1:es1KtYUFs7le0xQ3rOihkuoVD90z7D0fR2Qm4S00/gU= @@ -742,81 +1584,185 @@ github.com/aws/aws-sdk-go v1.25.37/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpi github.com/aws/aws-sdk-go v1.25.41/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.25.48/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/aws/aws-sdk-go v1.30.27/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/aws/aws-sdk-go v1.31.13/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go v1.34.0/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= github.com/aws/aws-sdk-go v1.35.24/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k= github.com/aws/aws-sdk-go v1.35.37/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.36.29/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.36.30/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.38.49/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.40.39/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= +github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= github.com/aws/aws-sdk-go v1.43.8/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go v1.43.11/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.43.16/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.44.45/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.44.95/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go v1.44.156/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aws/aws-sdk-go v1.44.164/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.44.217/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.44.257/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aws/aws-sdk-go v1.49.21 h1:Rl8KW6HqkwzhATwvXhyr7vD4JFUMi7oXGAw9SrxxIFY= github.com/aws/aws-sdk-go v1.49.21/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/aws/aws-sdk-go-v2 v1.7.1/go.mod h1:L5LuPC1ZgDr2xQS7AmIec/Jlc7O/Y1u2KxJyNVab250= github.com/aws/aws-sdk-go-v2 v1.8.0/go.mod h1:xEFuWz+3TYdlPRuo+CqATbeDWIWyaT5uAPwPaWtgse0= +github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= +github.com/aws/aws-sdk-go-v2 v1.16.7/go.mod h1:6CpKuLXg2w7If3ABZCl/qZ6rEgwtjZTn4eAf4RcEyuw= +github.com/aws/aws-sdk-go-v2 v1.16.11/go.mod h1:WTACcleLz6VZTp7fak4EO5b9Q4foxbn+8PIz3PmyKlo= +github.com/aws/aws-sdk-go-v2 v1.17.7/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= +github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= +github.com/aws/aws-sdk-go-v2 v1.20.1/go.mod h1:NU06lETsFm8fUC6ZjhgDpVBcGZTFQ6XM+LZWZxMI4ac= +github.com/aws/aws-sdk-go-v2 v1.24.1/go.mod h1:LNh45Br1YAkEKaAqvmE1m8FUx6a5b/V0oAKV7of29b4= github.com/aws/aws-sdk-go-v2 v1.26.1 h1:5554eUqIYVWpU0YmeeYZ0wU64H2VLBs8TlhRB2L+EkA= github.com/aws/aws-sdk-go-v2 v1.26.1/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.3/go.mod h1:gNsR5CaXKmQSSzrmGxmwmct/r+ZBfbxorAuXYsj/M5Y= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10/go.mod h1:VeTZetY5KRJLuD/7fkQXMU6Mw7H5m/KP2J5Iy9osMno= +github.com/aws/aws-sdk-go-v2/config v1.5.0/go.mod h1:RWlPOAW3E3tbtNAqTwvSW54Of/yP3oiZXMI0xfUdjyA= github.com/aws/aws-sdk-go-v2/config v1.6.0/go.mod h1:TNtBVmka80lRPk5+S9ZqVfFszOQAGJJ9KbT3EM3CHNU= +github.com/aws/aws-sdk-go-v2/config v1.17.1/go.mod h1:uOxDHjBemNTF2Zos+fgG0NNfE86wn1OAHDTGxjMEYi0= +github.com/aws/aws-sdk-go-v2/config v1.18.19/go.mod h1:XvTmGMY8d52ougvakOv1RpiTLPz9dlG/OQHsKU/cMmY= +github.com/aws/aws-sdk-go-v2/config v1.18.23/go.mod h1:rx0ruaQ+gk3OrLFHRRx56lA//XxP8K8uPzeNiKNuWVY= +github.com/aws/aws-sdk-go-v2/config v1.18.25/go.mod h1:dZnYpD5wTW/dQF0rRNLVypB396zWCcPiBIvdvSWHEg4= +github.com/aws/aws-sdk-go-v2/config v1.26.3/go.mod h1:Bxgi+DeeswYofcYO0XyGClwlrq3DZEXli0kLf4hkGA0= github.com/aws/aws-sdk-go-v2/config v1.27.2 h1:XnMKB9JRjfnxg9ZkUic4MiapnWJISWRo8HVM+7nx9qQ= github.com/aws/aws-sdk-go-v2/config v1.27.2/go.mod h1:z/XIktFoVIKNEqX/811vx4eHetrC3tAkgJKL1ZY/KM4= +github.com/aws/aws-sdk-go-v2/credentials v1.3.1/go.mod h1:r0n73xwsIVagq8RsxmZbGSRQFj9As3je72C2WzUIToc= github.com/aws/aws-sdk-go-v2/credentials v1.3.2/go.mod h1:PACKuTJdt6AlXvEq8rFI4eDmoqDFC5DpVKQbWysaDgM= +github.com/aws/aws-sdk-go-v2/credentials v1.12.14/go.mod h1:opAndTyq+YN7IpVG57z2CeNuXSQMqTYxGGlYH0m0RMY= +github.com/aws/aws-sdk-go-v2/credentials v1.13.18/go.mod h1:vnwlwjIe+3XJPBYKu1et30ZPABG3VaXJYr8ryohpIyM= +github.com/aws/aws-sdk-go-v2/credentials v1.13.22/go.mod h1:BfNcm6A9nSd+bzejDcMJ5RE+k6WbkCwWkQil7q4heRk= +github.com/aws/aws-sdk-go-v2/credentials v1.13.24/go.mod h1:jYPYi99wUOPIFi0rhiOvXeSEReVOzBqFNOX5bXYoG2o= +github.com/aws/aws-sdk-go-v2/credentials v1.16.14/go.mod h1:cniAUh3ErQPHtCQGPT5ouvSAQ0od8caTO9OOuufZOAE= github.com/aws/aws-sdk-go-v2/credentials v1.17.2 h1:tCZXWtH0HiIEZ50NJ7/QEaXmuzEd36L+2JUiZkp2nsc= github.com/aws/aws-sdk-go-v2/credentials v1.17.2/go.mod h1:7Zo+D6q4auSIo3p4EItuTKTk7J+RqjASISZqLvmUgpc= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.3.0/go.mod h1:2LAuqPx1I6jNfaGDucWfA2zqQCYCOMCDHiCOciALyNw= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.4.0/go.mod h1:Mj/U8OpDbcVcoctrYwA2bak8k/HFPdcLzI/vaiXMwuM= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.12/go.mod h1:aZ4vZnyUuxedC7eD4JyEHpGnCz+O2sHQEx3VvAwklSE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.1/go.mod h1:lfUx8puBRdM5lVVMQlwt2v+ofiG/X6Ms+dy0UkG/kXw= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3/go.mod h1:4Q0UFP0YJf0NrsEuEYHpM9fTSEVnD16Z3uyEF7J9JGM= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11/go.mod h1:cRrYDYAMUohBJUtUnOhydaMHtiK/1NZ0Otc9lIb6O0Y= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.1 h1:lk1ZZFbdb24qpOwVC1AwYNrswUjAxeyey6kFBVANudQ= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.1/go.mod h1:/xJ6x1NehNGCX4tvGzzj2bq5TBOT/Yxq+qbL9Jpx2Vk= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.3.2/go.mod h1:qaqQiHSrOUVOfKe6fhgQ6UzhxjwqVW8aHNegd6Ws4w4= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.4.0/go.mod h1:eHwXu2+uE/T6gpnYWwBwqoeqRf9IXyCcolyOWDRAErQ= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.60/go.mod h1:HLWzCoNyzaPkOOs9yZ3muJ91lSk8O9DJbJw5aKAWWHY= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.14/go.mod h1:kdjrMwHwrC3+FsKhNcCMJ7tUVj/8uSD5CZXeQ4wV6fM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.18/go.mod h1:348MLhzV1GSlZSMusdwQpXKbhD7X2gbI/TxwAPKkYZQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.31/go.mod h1:QT0BqUvX1Bh2ABdTGnjqEjvjzrCfIniM9Sc8zn9Yndo= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33/go.mod h1:7i0PF1ME/2eUPFcjkVIwq+DOygHEoK92t5cDqNgYbIw= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10/go.mod h1:6BkRjejp/GR4411UGqkX8+wFMbFbqsUIimfK4XjOKR4= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 h1:aw39xVGeRWlWx9EzGVnhOR4yOjQDHPQ6o6NmBlscyQg= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5/go.mod h1:FSaRudD0dXiMPK2UjknVwwTYyZMRsHv3TtkabsZih5I= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.8/go.mod h1:ZIV8GYoC6WLBW5KGs+o4rsc65/ozd+eQ0L31XF5VDwk= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.12/go.mod h1:ckaCVTEdGAxO6KwTGzgskxR1xM+iJW4lxMyDFVda2Fc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.25/go.mod h1:zBHOPwhBc3FlQjQJE/D3IfPWiWaQmT06Vq9aNukDo0k= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27/go.mod h1:UrHnn3QV/d0pBZ6QBAEQcqFLf8FAzLmoUfPVIueOvoM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10/go.mod h1:6UV4SZkVvmODfXKql4LCbaZUpF7HO2BX38FgBf9ZOLw= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 h1:PG1F3OD1szkuQPzDw3CIQsRIrtTlUC3lP84taWzHlq0= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5/go.mod h1:jU1li6RFryMz+so64PpKtudI+QzbKoIEivqdf6LNpOc= +github.com/aws/aws-sdk-go-v2/internal/ini v1.1.1/go.mod h1:Zy8smImhTdOETZqfyn01iNOe0CNggVbPjCajyaz6Gvg= github.com/aws/aws-sdk-go-v2/internal/ini v1.2.0/go.mod h1:Q5jATQc+f1MfZp3PDMhn6ry18hGvE0i8yvbXoKbnZaE= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.19/go.mod h1:cVHo8KTuHjShb9V8/VjH3S/8+xPu16qx8fdGwmotJhE= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.32/go.mod h1:XGhIBZDEgfqmFIugclZ6FU7v75nHhBDtzuB4xB/tEi4= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34/go.mod h1:Etz2dj6UHYuw+Xw830KfzCfWGMzqvUTCjUj5b76GVDc= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.2/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.5/go.mod h1:aIwFF3dUk95ocCcA3zfk3nhz0oLkpzHFWuMp8l/4nNs= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.23/go.mod h1:uIiFgURZbACBEQJfqTZPb/jxO7R+9LeoHUFudtIdeQI= github.com/aws/aws-sdk-go-v2/service/autoscaling v1.40.5 h1:vhdJymxlWS2qftzLiuCjSswjXBRLGfzo/BEE9LDveBA= github.com/aws/aws-sdk-go-v2/service/autoscaling v1.40.5/go.mod h1:ZErgk/bPaaZIpj+lUWGlwI1A0UFhSIscgnCPzTLnb2s= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= github.com/aws/aws-sdk-go-v2/service/ec2 v1.148.2 h1:1oOlVyfM5Lzn/XKjqoVyy2i4OQhqOPaqYg3Jk+cZ4FE= github.com/aws/aws-sdk-go-v2/service/ec2 v1.148.2/go.mod h1:7MUTgVVnC1GAxx4SNQqzQalrm1n4v1HYa/R/LEB3CKo= +github.com/aws/aws-sdk-go-v2/service/ecr v1.18.11/go.mod h1:Ce1q2jlNm8BVpjLaOnwnm5v2RClAbK6txwPljFzyW6c= +github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.16.2/go.mod h1:uHtRE7aqXNmpeYL+7Ec7LacH5zC9+w2T5MBOeEKDdu0= github.com/aws/aws-sdk-go-v2/service/eks v1.39.2 h1:KLVRI2J2tH/0M/mGeL8IQIFfMH7YY2sxzzMWjSGol0M= github.com/aws/aws-sdk-go-v2/service/eks v1.39.2/go.mod h1:gzXWmY937TLpT2GJbYBfgb664o/GlwkNNWQ6RGPFyeQ= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.2.1/go.mod h1:v33JQ57i2nekYTA70Mb+O18KeH4KqhdqxTJZNK1zdRE= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.2.2/go.mod h1:EASdTcM1lGhUe1/p4gkojHwlGJkeoRjjr1sRCzup3Is= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.3/go.mod h1:gkb2qADY+OHaGLKNTYxMaQNacfeyQpZ4csDTQMeFmcw= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11/go.mod h1:iV4q2hsqtNECrfmlXyord9u4zyuFEJX9eLgLpSPzWA8= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4/go.mod h1:2aGXHFmbInwgP9ZfpmdIfOELL79zhdNYNmReK8qDfdQ= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1 h1:EyBZibRTVAs6ECHZOw5/wlylS9OcTzwyjeQMudmREjE= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1/go.mod h1:JKpmtYhhPs7D97NL/ltqz7yCkERFW5dOlHyVl66ZYF8= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.9/go.mod h1:EF5RLnD9l0xvEWwMRcktIS/dI6lF8lU5eV3B13k6sWo= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.26/go.mod h1:2UqAAwMUXKeRkAHIlDJqvMVgOWkUi/AUXPk/YIe+Dg4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.2.1/go.mod h1:zceowr5Z1Nh2WVP8bf/3ikB41IZW59E4yIYbg+pC6mw= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.2.2/go.mod h1:NXmNI41bdEsJMrD0v9rUvbGCB5GwdBEpKvUvIY3vTFg= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.8/go.mod h1:rDVhIMAX9N2r8nWxDUlbubvvaFMnfsm+3jAV7q+rpM4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.12/go.mod h1:1TODGhheLWjpQWSuhYuAUWYTCKwEjx2iblIFKDHjeTc= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.25/go.mod h1:/95IA+0lMnzW6XzqYJRpjjsAbKEORVeO0anQqjd2CNU= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27/go.mod h1:EOwBD4J4S5qYszS5/3DpkejfuK+Z5/1uzICfPaZLtqw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10/go.mod h1:wohMUQiFdzo0NtxbBg0mSRGZ4vL3n0dKjLTINdcIino= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.1 h1:cVP8mng1RjDyI3JN/AXFCn5FHNlsBaBH0/MBtG1bg0o= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.1/go.mod h1:C8sQjoyAsdfjC7hpy4+S6B92hnFzx0d0UAyHicaOTIE= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.5.1/go.mod h1:6EQZIwNNvHpq/2/QSJnp4+ECvqIy55w95Ofs0ze+nGQ= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.5.2/go.mod h1:QuL2Ym8BkrLmN4lUofXYq6000/i5jPjosCNK//t6gak= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.8/go.mod h1:JlVwmWtT/1c5W+6oUsjXjAJ0iJZ+hlghdrDy/8JxGCU= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.14.0/go.mod h1:bh2E0CXKZsQN+faiKVqC40vfNMAWheoULBCnEgO9K+8= +github.com/aws/aws-sdk-go-v2/service/kms v1.21.1/go.mod h1:EEfb4gfSphdVpRo5sGf2W3KvJbelYUno5VaXR5MJ3z4= +github.com/aws/aws-sdk-go-v2/service/kms v1.27.9/go.mod h1:2tFmR7fQnOdQlM2ZCEPpFnBIQD1U8wmXmduBgZbOag0= +github.com/aws/aws-sdk-go-v2/service/s3 v1.11.1/go.mod h1:XLAGFrEjbvMCLvAtWLLP32yTv8GpBquCApZEycDLunI= github.com/aws/aws-sdk-go-v2/service/s3 v1.12.0/go.mod h1:6J++A5xpo7QDsIeSqPK4UHqMSyPOCopa+zKtqAMhqVQ= +github.com/aws/aws-sdk-go-v2/service/s3 v1.27.1/go.mod h1:NffjpNsMUFXp6Ok/PahrktAncoekWrywvmIK83Q2raE= +github.com/aws/aws-sdk-go-v2/service/s3 v1.31.0/go.mod h1:ncltU6n4Nof5uJttDtcNQ537uNuwYqsZZQcpkd2/GUQ= +github.com/aws/aws-sdk-go-v2/service/s3 v1.31.1/go.mod h1:ncltU6n4Nof5uJttDtcNQ537uNuwYqsZZQcpkd2/GUQ= +github.com/aws/aws-sdk-go-v2/service/sso v1.3.1/go.mod h1:J3A3RGUvuCZjvSuZEcOpHDnzZP/sKbhDWV2T1EOzFIM= github.com/aws/aws-sdk-go-v2/service/sso v1.3.2/go.mod h1:J21I6kF+d/6XHVk7kp/cx9YVD2TMD2TbLwtRGVcinXo= +github.com/aws/aws-sdk-go-v2/service/sso v1.11.17/go.mod h1:mS5xqLZc/6kc06IpXn5vRxdLaED+jEuaSRv5BxtnsiY= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.6/go.mod h1:Y1VOmit/Fn6Tz1uFAeCO6Q7M2fmfXSCLeL5INVYsLuY= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.10/go.mod h1:ouy2P4z6sJN70fR3ka3wD3Ro3KezSxU6eKGQI2+2fjI= +github.com/aws/aws-sdk-go-v2/service/sso v1.18.6/go.mod h1:+mJNDdF+qiUlNKNC3fxn74WWNN+sOiGOEImje+3ScPM= github.com/aws/aws-sdk-go-v2/service/sso v1.19.2 h1:pnj8llQoBAHD4UmbM8UM5GdfycFJKMhgPSeaOyRaZ34= github.com/aws/aws-sdk-go-v2/service/sso v1.19.2/go.mod h1:x6/tCd1o/AOKQR+iYnjrzhJxD+w0xRN34asGPaSV7ew= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.6/go.mod h1:Lh/bc9XUf8CfOY6Jp5aIkQtN+j1mc+nExc+KXj9jx2s= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.10/go.mod h1:AFvkxc8xfBe8XA+5St5XIHHrQQtkxqrRincx4hmMHOk= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.6/go.mod h1:ykf3COxYI0UJmxcfcxcVuz7b6uADi1FkiUz6Eb7AgM8= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.22.2 h1:L4yhKxW6HbTSQ08OsvPJuaspaLE40qMgprgXUNFUiMg= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.22.2/go.mod h1:lZB123q0SVQ3dfIbEOcGzhQHrwVBcHVReNS9tm20oU4= +github.com/aws/aws-sdk-go-v2/service/sts v1.6.0/go.mod h1:q7o0j7d7HrJk/vr9uUt3BVRASvcU7gYZB9PUgPiByXg= github.com/aws/aws-sdk-go-v2/service/sts v1.6.1/go.mod h1:hLZ/AnkIKHLuPGjEiyghNEdvJ2PP0MgOxcmv9EBJ4xs= +github.com/aws/aws-sdk-go-v2/service/sts v1.16.13/go.mod h1:Ru3QVMLygVs/07UQ3YDur1AQZZp2tUNje8wfloFttC0= +github.com/aws/aws-sdk-go-v2/service/sts v1.18.7/go.mod h1:JuTnSoeePXmMVe9G8NcjjwgOKEfZ4cOjMuT2IBT/2eI= +github.com/aws/aws-sdk-go-v2/service/sts v1.18.11/go.mod h1:BgQOMsg8av8jset59jelyPW7NoZcZXLVpDsXunGDrk8= +github.com/aws/aws-sdk-go-v2/service/sts v1.19.0/go.mod h1:BgQOMsg8av8jset59jelyPW7NoZcZXLVpDsXunGDrk8= +github.com/aws/aws-sdk-go-v2/service/sts v1.26.7/go.mod h1:6h2YuIoxaMSCFf5fi1EgZAwdfkGMgDY+DVfa61uLe4U= github.com/aws/aws-sdk-go-v2/service/sts v1.27.2 h1:Dr+7r/p20XpN+1U5tVNZfA2bLq0kQ9IjVBM0iAyMMLg= github.com/aws/aws-sdk-go-v2/service/sts v1.27.2/go.mod h1:ozhhG9/NB5c9jcmhGq6tX9dpp21LYdmRWRQVppASim4= +github.com/aws/smithy-go v1.6.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aws/smithy-go v1.7.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/aws/smithy-go v1.12.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/aws/smithy-go v1.12.1/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/aws/smithy-go v1.13.1/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/aws/smithy-go v1.14.1/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/aws/smithy-go v1.19.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= +github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20230510185313-f5e39e5f34c7/go.mod h1:VVALgT1UESBh91dY0GprHnT1Z7mKd96VDk8qVy+bmu0= github.com/axiomhq/hyperloglog v0.0.0-20220105174342-98591331716a/go.mod h1:2stgcRjl6QmW+gU2h5E7BQXg4HU0gzxKWDuT5HviN9s= +github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc= github.com/banzaicloud/k8s-objectmatcher v1.5.1/go.mod h1:9MWY5HsM/OaTmoTirczhlO8UALbH722WgdpaaR7Y8OE= github.com/bazelbuild/buildtools v0.0.0-20190917191645-69366ca98f89/go.mod h1:5JP0TXzWDHXv8qvxRC4InIazwdyDseBDbzESUMKk1yU= +github.com/beeker1121/goque v1.0.3-0.20191103205551-d618510128af/go.mod h1:84CWnaDz4g1tEVnFLnuBigmGK15oPohy0RfvSN8d4eg= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/biogo/store v0.0.0-20160505134755-913427a1d5e8/go.mod h1:Iev9Q3MErcn+w3UOJD/DkEzllvugfdx7bGcMOFhvr/4= github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= @@ -830,10 +1776,14 @@ github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2y github.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHfpE= github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc= github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= +github.com/bluekeyes/go-gitdiff v0.7.1/go.mod h1:QpfYYO1E0fTVHVZAZKiRjtSGY9823iCdvGXBcEzHGbM= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/bmizerany/perks v0.0.0-20141205001514-d9a9656a3a4b/go.mod h1:ac9efd0D1fsDb3EJvhqgXRbFx7bs2wqZ10HQPeU8U/Q= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/bombsimon/wsl/v3 v3.3.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= github.com/brancz/gojsontoyaml v0.0.0-20190425155809-e8bd32d46b3d/go.mod h1:IyUJYN1gvWjtLF5ZuygmxbnsAyP3aJS6cHzIuZY50B0= github.com/breml/bidichk v0.2.3/go.mod h1:8u2C6DnAy0g2cEq+k/A2+tr9O1s+vHGxWn0LTc70T2A= @@ -843,6 +1793,8 @@ github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR github.com/bshuster-repo/logrus-logstash-hook v1.0.0/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= github.com/bshuster-repo/logrus-logstash-hook v1.0.2 h1:JYRWo+QGnQdedgshosug9hxpPYTB9oJ1ZZD3fY31alU= github.com/bshuster-repo/logrus-logstash-hook v1.0.2/go.mod h1:HgYntJprnHSPaF9VPPPLP1L5S1vMWxRfa1J+vzDrDTw= +github.com/bsm/ginkgo/v2 v2.9.5/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= +github.com/bsm/gomega v1.26.0/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= @@ -853,13 +1805,17 @@ github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3k github.com/bugsnag/panicwrap v1.3.4 h1:A6sXFtDGsgU/4BLf5JT0o5uYg3EeKgGx3Sfs+/uk3pU= github.com/bugsnag/panicwrap v1.3.4/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/butuzov/ireturn v0.1.1/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= +github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= +github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/bwmarrin/snowflake v0.0.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE= +github.com/bytecodealliance/wasmtime-go v0.36.0/go.mod h1:q320gUxqyI8yB+ZqRuaJOEnGkAnHh6WtJjMaT2CW4wI= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= +github.com/c2h5oh/datasize v0.0.0-20171227191756-4eba002a5eae/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M= github.com/campoy/embedmd v1.0.0/go.mod h1:oxyr9RCiSXg0M3VJ3ks0UGfp98BpSSGr0kpiX3MzVl8= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= -github.com/cenk/backoff v2.0.0+incompatible/go.mod h1:7FtoeaSnHoZnmZzz47cM35Y9nSW7tNyaidugnHTaFDE= +github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= github.com/cenkalti/backoff v0.0.0-20181003080854-62661b46c409/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= @@ -870,6 +1826,8 @@ github.com/cenkalti/backoff/v4 v4.1.0/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInq github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.2.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -877,7 +1835,6 @@ github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMr github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/centrify/cloud-golang-sdk v0.0.0-20190214225812-119110094d0f/go.mod h1:C0rtzmGXgN78pYR0tGJFhtHgkbAs0lIbHwkB81VxDQE= github.com/centrify/cloud-golang-sdk v0.0.0-20210923165758-a8c48d049166/go.mod h1:c/gmvyN8lq6lYtHvrqqoXrg2xyN65N0mBmbikxFWXNE= -github.com/certifi/gocertifi v0.0.0-20180905225744-ee1a9a0726d2/go.mod h1:GJKEexRPVJrBSOjoqN5VNOIKJ5Q3RViH6eu3puDRwx4= github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/xxhash v0.0.0-20181017004759-096ff4a8a059/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= @@ -899,22 +1856,33 @@ github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhD github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= github.com/cheynewallace/tabby v1.1.1/go.mod h1:Pba/6cUL8uYqvOc9RkyvFbHGrQ9wShyrn6/S/1OYVys= github.com/chrismalek/oktasdk-go v0.0.0-20181212195951-3430665dfaa0/go.mod h1:5d8DqS60xkj9k3aXfL3+mXBH0DPYO0FQjcKosxl+b/Q= +github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589/go.mod h1:OuDyvmLnMCwa2ep4Jkm6nyA0ocJuZlGyk2gGseVzERM= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY= +github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic= +github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= +github.com/cilium/ebpf v0.9.1/go.mod h1:+OhNOIXx/Fnu1IE8bJz2dzOA+VSfyTfdNUVdlQnxUFY= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clarketm/json v1.13.4/go.mod h1:ynr2LRfb0fQU34l07csRNBTcivjySLLiY1YzQqKVfdo= +github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudevents/sdk-go/v2 v2.14.0 h1:Nrob4FwVgi5L4tV9lhjzZcjYqFVyJzsA56CwPaPfv6s= github.com/cloudevents/sdk-go/v2 v2.14.0/go.mod h1:xDmKfzNjM8gBvjaF8ijFjM1VYOVUEeUfapHMUX1T5To= +github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I= +github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cloudfoundry-community/go-cfclient v0.0.0-20190201205600-f136f9222381/go.mod h1:e5+USP2j8Le2M0Jo3qKPFnNhuo1wueU4nWHCXBOfQ14= github.com/cloudfoundry-community/go-cfclient v0.0.0-20210823134051-721f0e559306/go.mod h1:0FdHblxw7g3M2PPICOw9i8YZOHP9dZTHbJUtoxL7Z/E= github.com/cloudfoundry/gosigar v0.0.0-20150402170747-3ed7c74352da/go.mod h1:3qLfc2GlfmwOx2+ZDaRGH3Y9fwQ0sQeaAleo2GV5pH0= @@ -923,28 +1891,38 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230112175826-46e39c7b9b43/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230428030218-4003588d1b74/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/PB79y4KOPYVyFYdROxgaCwdTQ= github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/cockroachdb/cmux v0.0.0-20170110192607-30d10be49292/go.mod h1:qRiX68mZX1lGBkTWyp3CLcenw9I94W2dLeRvMzcn9N4= -github.com/cockroachdb/cockroach v0.0.0-20170608034007-84bc9597164f/go.mod h1:xeT/CQ0qZHangbYbWShlCGAx31aV4AjGswDUjhKS6HQ= github.com/cockroachdb/cockroach-go v0.0.0-20181001143604-e0a95dfd547c/go.mod h1:XGLbWH/ujMcbPbhZq52Nv6UrCghb1yGn//133kEsvDk= +github.com/cockroachdb/cockroach-go/v2 v2.3.3/go.mod h1:1wNJ45eSXW9AnOc3skntW9ZUZz6gxrQK3cOj3rK+BC8= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= +github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= github.com/codegangsta/cli v1.13.1-0.20160326223947-bc465becccd1/go.mod h1:/qJNoX69yVSKu5o4jLyXAENLRyk1uhi7zkbQ3slBdOA= github.com/codegangsta/inject v0.0.0-20140425184007-37d7f8432a3e/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/codeskyblue/go-sh v0.0.0-20170112005953-b097669b1569/go.mod h1:2hUMLQDY+46DXIf/i7n2rUCHUwF3gZrb4slZV8C4RYI= +github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c= +github.com/container-orchestrated-devices/container-device-interface v0.5.4/go.mod h1:DjE95rfPiiSmG7uVXtg0z6MnPm/Lx4wxKCIts0ZE0vg= github.com/container-storage-interface/spec v1.1.0/go.mod h1:6URME8mwIBbpVyZV93Ce5St17xBiQJQY67NDsuohiy4= github.com/container-storage-interface/spec v1.2.0/go.mod h1:6URME8mwIBbpVyZV93Ce5St17xBiQJQY67NDsuohiy4= github.com/container-storage-interface/spec v1.5.0/go.mod h1:8K96oQNkJ7pFcC2R9Z1ynGGBB1I93kcS6PGg3SsOk8s= @@ -958,6 +1936,7 @@ github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/btrfs/v2 v2.0.0/go.mod h1:swkD/7j9HApWpzl8OHfrHNxppPd9l44DFZdF94BUj9k= github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= @@ -966,8 +1945,10 @@ github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4S github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8= +github.com/containerd/cgroups v1.0.4/go.mod h1:nLNQtsF7Sl2HxNebu77i1R0oDlhiTG+kO4JTrUzo6IA= github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= +github.com/containerd/cgroups/v3 v3.0.2/go.mod h1:JUgITrzdFqp42uI2ryGA+ge0ap/nxzYgkGmIcetmErE= github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= @@ -991,11 +1972,17 @@ github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= +github.com/containerd/containerd v1.5.2/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s= github.com/containerd/containerd v1.5.13/go.mod h1:3AlCrzKROjIuP3JALsY14n8YtntaUDBu7vek+rPN5Vc= github.com/containerd/containerd v1.6.1/go.mod h1:1nJz5xCZPusx6jJU8Frfct988y0NpumIq9ODB0kLtoE= github.com/containerd/containerd v1.6.6/go.mod h1:ZoP1geJldzCVY3Tonoz7b1IXk8rIX0Nltt5QE4OMNk0= +github.com/containerd/containerd v1.6.8/go.mod h1:By6p5KqPK0/7/CgO/A6t/Gz+CUYUu2zf1hUaaymVXB0= +github.com/containerd/containerd v1.6.9/go.mod h1:XVicUvkxOrftE2Q1YWUXgZwkkAxwQYNOFzYWvfVfEfQ= +github.com/containerd/containerd v1.6.18/go.mod h1:1RdCUu95+gc2v9t3IL+zIlpClSmew7/0YS8O5eQZrOw= +github.com/containerd/containerd v1.6.19/go.mod h1:HZCDMn4v/Xl2579/MvtOC2M206i+JJ6VxFWU/NetrGY= +github.com/containerd/containerd v1.6.23/go.mod h1:UrQOiyzrLi3n4aezYJbQH6Il+YzTvnHFbEuO3yfDrM4= github.com/containerd/containerd v1.7.11 h1:lfGKw3eU35sjV0aG2eYZTiwFEY1pCzxdzicHP3SZILw= github.com/containerd/containerd v1.7.11/go.mod h1:5UluHxHTX2rdvYuZ5OJTC5m/KJNs0Zs9wVoJm9zf5ZE= github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= @@ -1019,11 +2006,13 @@ github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZ github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/fifo v1.1.0/go.mod h1:bmC4NWMbXlt2EZ0Hc7Fx7QzTFxgPID13eH0Qu+MAb2o= github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= github.com/containerd/go-cni v1.1.0/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= github.com/containerd/go-cni v1.1.3/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= github.com/containerd/go-cni v1.1.6/go.mod h1:BWtoWl5ghVymxu6MBjg79W9NZrCRyHIdUtk4cauMe34= +github.com/containerd/go-cni v1.1.9/go.mod h1:XYrZJ1d5W6E2VOvjffL3IZq0Dz6bsVlERHbekNK90PM= github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= @@ -1035,47 +2024,58 @@ github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5A github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= github.com/containerd/imgcrypt v1.1.3/go.mod h1:/TPA1GIDXMzbj01yd8pIbQiLdQxed5ue1wb8bP7PQu4= github.com/containerd/imgcrypt v1.1.4/go.mod h1:LorQnPtzL/T0IyCeftcsMEO7AqxUDbdO8j/tSUpgxvo= +github.com/containerd/imgcrypt v1.1.7/go.mod h1:FD8gqIcX5aTotCtOmjeCsi3A1dHmTZpnMISGKSczt4k= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/nri v0.4.0/go.mod h1:Zw9q2lP16sdg0zYybemZ9yTDy8g7fPCIB3KXOGlggXI= github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= +github.com/containerd/stargz-snapshotter/estargz v0.7.0/go.mod h1:83VWDqHnurTKliEB0YvWMiCfLDwv4Cjj1X9Vk98GJZw= +github.com/containerd/stargz-snapshotter/estargz v0.14.3/go.mod h1:KY//uOCIkSuNAHhJogcZtrNHdKrA99/FCCRjE3HD36o= github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= +github.com/containerd/ttrpc v1.1.1-0.20220420014843-944ef4a40df3/go.mod h1:YYyNVhZrTMiaf51Vj6WhAJqJw+vl/nzABhj8pWrzle4= +github.com/containerd/ttrpc v1.1.2/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= +github.com/containerd/ttrpc v1.2.2/go.mod h1:sIT6l32Ph/H9cvnJsfXM5drIVzTr5A2flTf1G5tYZak= github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= +github.com/containerd/typeurl/v2 v2.1.1/go.mod h1:IDp2JFvbwZ31H8dQbEIY7sDl2L3o3HZj1hsSQlywkQ0= github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v1.1.0/go.mod h1:oZF9wBnrnQjpWLaPKEinrx3TQ9a+W/RJO7Zb41d8YLE= github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= github.com/containernetworking/cni v1.0.1/go.mod h1:AKuhXbN5EzmD4yTNtfSsX3tPcmtrBI6QcRV0NiNt15Y= github.com/containernetworking/cni v1.1.1/go.mod h1:sDpYKmGVENF3s6uvMvGgldDWeG8dMxakj/u+i9ht9vw= +github.com/containernetworking/cni v1.1.2/go.mod h1:sDpYKmGVENF3s6uvMvGgldDWeG8dMxakj/u+i9ht9vw= github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= github.com/containernetworking/plugins v1.0.1/go.mod h1:QHCfGpaTwYTbbH+nZXKVTxNBDZcxSOplJT5ico8/FLE= github.com/containernetworking/plugins v1.1.1/go.mod h1:Sr5TH/eBsGLXK/h71HeLfX19sZPp3ry5uHSkI4LPxV8= +github.com/containernetworking/plugins v1.2.0/go.mod h1:/VjX4uHecW5vVimFa1wkG4s+r/s9qIfPdqlLF4TW8c4= github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= github.com/containers/ocicrypt v1.1.2/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= github.com/containers/ocicrypt v1.1.3/go.mod h1:xpdkbVAuaH3WzbEabUd5yDsl9SwJA5pABH85425Es2g= +github.com/containers/ocicrypt v1.1.6/go.mod h1:WgjxPWdTJMqYMjf3M6cuIFFA1/MpyyhIM99YInA+Rvc= github.com/coredns/caddy v1.1.0/go.mod h1:A6ntJQlAWuQfFlsd9hvigKbo2WS0VUs2l1e2F+BawD4= github.com/coredns/corefile-migration v1.0.17/go.mod h1:XnhgULOEouimnzgn0t4WPuFDN2/PJQcTxdWKC5eXNGE= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.12+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= @@ -1086,6 +2086,8 @@ github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHo github.com/coreos/go-oidc v2.2.1+incompatible h1:mh48q/BqXqgjVHpy2ZY7WnWAbenxRjsz9N1i1YxjHAk= github.com/coreos/go-oidc v2.2.1+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-oidc/v3 v3.1.0/go.mod h1:rEJ/idjfUyfkBit1eI1fvyr+64/g9dcKpAm8MJMesvo= +github.com/coreos/go-oidc/v3 v3.5.0/go.mod h1:ecXRtV4romGPeO6ieExAsUK9cb/3fp9hXNz1tlv8PIM= +github.com/coreos/go-oidc/v3 v3.9.0/go.mod h1:rTKz2PYwftcrtoCzV5g5kvfJoWcm0Mk8AF8y1iAQro4= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= @@ -1098,13 +2100,15 @@ github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7 github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/go-systemd/v22 v22.4.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/prometheus-operator v0.31.1/go.mod h1:vHwtP2e+VmEeS6m6lgp87aH+npGVRQsCi5jhcuQA1sA= github.com/coreos/prometheus-operator v0.38.0 h1:gF2xYIfO09XLFdyEecND46uihQ2KTaDwTozRZpXLtN4= github.com/coreos/prometheus-operator v0.38.0/go.mod h1:xZC7/TgeC0/mBaJk+1H9dbHaiEvLYHgX6Mi1h40UPh8= github.com/couchbase/gocb/v2 v2.3.3/go.mod h1:h4b3UYDnGI89hMW9VypVjAr+EE0Ki4jjlXJrVdmSZhQ= github.com/couchbase/gocbcore/v10 v10.0.4/go.mod h1:s6dwBFs4c3+cAzZbo1q0VW+QasudhHJuehE8b8U2YNg= +github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= @@ -1113,6 +2117,7 @@ github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46t github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/cristalhq/acmd v0.8.1/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= @@ -1128,8 +2133,13 @@ github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/ github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= github.com/daixiang0/gci v0.8.1/go.mod h1:EpVfrztufwVgQRXjnX4zuNinEpLj5OmMjtu/+MB0V0c= github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= +github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= +github.com/dave/dst v0.26.2/go.mod h1:UMDJuIRPfyUCC78eFuB+SV/WI8oDeyFDvM/JR6NI3IU= +github.com/dave/gopackages v0.0.0-20170318123100-46e7023ec56e/go.mod h1:i00+b/gKdIDIxuLDFob7ustLAVqhsZRk2qVZrArELGQ= +github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= github.com/dave/jennifer v1.4.1/go.mod h1:7jEdnm+qBcxl8PC0zyp7vxcpSRnzXSt9r39tpTVGlwA= -github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dave/kerr v0.0.0-20170318121727-bc25dd6abe8e/go.mod h1:qZqlPyPvfsDJt+3wHJ1EvSXDuVjFTK0j2p/ca+gtsb8= +github.com/dave/rebecca v0.9.1/go.mod h1:N6XYdMD/OKw3lkF3ywh8Z6wPGuwNFDNtWYEMFWEmXBA= github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -1137,6 +2147,9 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-xdr v0.0.0-20161123171359-e6a2ba005892/go.mod h1:CTDl0pzVzE5DEzZhPfvhY/9sPFMQIxaJ9VAMs9AagrE= github.com/daviddengcn/go-colortext v1.0.0/go.mod h1:zDqEI5NVUop5QPpVJUxE9UO10hRnmkD5G4Pmri9+m4c= +github.com/davidmz/go-pageant v1.0.2/go.mod h1:P2EDDnMqIwG5Rrp05dTRITj9z2zpGcD9efWSkTNKLIE= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d/go.mod h1:tmAIfUFEirG/Y8jhZ9M+h36obRZAk/1fcSpXwAVlfqE= github.com/deepmap/oapi-codegen v1.3.6/go.mod h1:aBozjEveG+33xPiP55Iw/XbVkhtZHEGLq3nxlX0+hfU= github.com/deepmap/oapi-codegen v1.8.2 h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbzjuhfU= github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= @@ -1145,19 +2158,30 @@ github.com/denisenkom/go-mssqldb v0.0.0-20190111225525-2fea367d496d/go.mod h1:xN github.com/denisenkom/go-mssqldb v0.0.0-20190412130859-3b1d194e553a/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM= github.com/denisenkom/go-mssqldb v0.9.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/denisenkom/go-mssqldb v0.12.2/go.mod h1:lnIw1mZukFRZDJYQ0Pb833QS2IaC3l5HkEfra2LJ+sk= +github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= github.com/denverdino/aliyungo v0.0.0-20170926055100-d3308649c661/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= github.com/devans10/pugo/flasharray v0.0.0-20230602184138-1a5d930c950e h1:16wEsIhNjPDqdsTr2mu2zn7Saf1gvGAVtjxnavQZIZs= github.com/devans10/pugo/flasharray v0.0.0-20230602184138-1a5d930c950e/go.mod h1:7dF4rgfqItyj4bkbwZkwp/Ul+bM4lku/CQvS9OIYF4o= github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= -github.com/dgrijalva/jwt-go v0.0.0-20161101193935-9ed569b5d1ac/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgraph-io/badger/v3 v3.2103.2/go.mod h1:RHo4/GmYcKKh5Lxu63wLEMHJ70Pac2JqZRYGhlyAo2M= +github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.1-0.20180719211823-0b96aaa70776+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-gk v0.0.0-20140819190930-201884a44051/go.mod h1:qm+vckxRlDt0aOla0RYJJVeqHZlWfOm2UIxHaqPB46E= +github.com/dgryski/go-gk v0.0.0-20200319235926-a69029f61654/go.mod h1:qm+vckxRlDt0aOla0RYJJVeqHZlWfOm2UIxHaqPB46E= +github.com/dgryski/go-lttb v0.0.0-20180810165845-318fcdf10a77/go.mod h1:Va5MyIzkU0rAM92tn3hb3Anb7oz7KcnixF49+2wOMe4= github.com/dgryski/go-metro v0.0.0-20180109044635-280f6062b5bc/go.mod h1:c9O8+fpSOX1DM8cPNSkX/qsBWdkD4yd2dpciOWQjpBw= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dgryski/go-sip13 v0.0.0-20190329191031-25c5027a8c7b/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dgryski/go-sip13 v0.0.0-20200911182023-62edffca9245/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/digitalocean/godo v1.7.5/go.mod h1:h6faOIcZ8lWIwNQ+DN7b3CgX4Kwby5T+nbpNqkUIozU= +github.com/digitalocean/godo v1.78.0/go.mod h1:GBmu8MkjZmNARE7IXRPmkbbnocNN8+uBm0xbEVw2LCs= +github.com/digitalocean/godo v1.97.0/go.mod h1:NRpFznZFvhHjBoqZAaOD3khVzsJ3EibzKqFL4R60dmA= github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= @@ -1165,15 +2189,21 @@ github.com/distribution/distribution/v3 v3.0.0-20220526142353-ffbd94cbe269 h1:hb github.com/distribution/distribution/v3 v3.0.0-20220526142353-ffbd94cbe269/go.mod h1:28YO/VJk9/64+sTGNuYaBjWxrXTPrj0C0XmgTIOjxX4= github.com/djherbis/atime v1.0.0/go.mod h1:5W+KBIuTwVGcqjIfaTwt+KSYX1o6uep8dtevevQP/f8= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/dnephin/pflag v1.0.7/go.mod h1:uxE91IoWURlOiTUIA8Mq5ZZkAv3dPUfZNaT80Zm7OQE= github.com/docker/cli v0.0.0-20190925022749-754388324470/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.7+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/cli v20.10.8+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/cli v20.10.9+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/cli v20.10.14+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/cli v20.10.17+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/cli v20.10.18+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v23.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v23.0.3+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v23.0.5+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/cli v24.0.0+incompatible h1:0+1VshNwBQzQAx9lOl+OYCTCEAD8fKs/qeXMx3O0wqM= github.com/docker/cli v24.0.0+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v0.0.0-20191216044856-a8371794149d h1:jC8tT/S0OGx2cswpeUTn4gOIea8P08lD3VFQT0cOZ50= @@ -1210,34 +2240,40 @@ github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdf github.com/duosecurity/duo_api_golang v0.0.0-20190308151101-6c680f768e74/go.mod h1:UqXY1lYT/ERa4OEAywUqdok1T4RCRdArkhic1Opuavo= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= github.com/educlos/testrail v0.0.0-20210915115134-adb5e6f62a6d h1:Pg0HK2hfiHcqLKEp2Oryq+XsDBN31qYUT2IdWeJl9x8= github.com/educlos/testrail v0.0.0-20210915115134-adb5e6f62a6d/go.mod h1:aK0PgWGMpraVr1jZPLabKymsSLzNy6GVZ7nLuhjts1s= +github.com/eggsampler/acme/v3 v3.3.0/go.mod h1:/qh0rKC/Dh7Jj+p4So7DbWmFNzC4dpcpK53r226Fhuo= +github.com/eggsampler/acme/v3 v3.4.0/go.mod h1:/qh0rKC/Dh7Jj+p4So7DbWmFNzC4dpcpK53r226Fhuo= github.com/elastic/go-sysinfo v1.0.1/go.mod h1:O/D5m1VpYLwGjCYzEt63g3Z1uO3jXfwyzzjiW90t8cY= github.com/elastic/go-sysinfo v1.1.1/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= github.com/elastic/go-windows v1.0.1/go.mod h1:FoVvqWSun28vaDQPbj2Elfc0JahhPB7WQEGa3c814Ss= -github.com/elastic/gosigar v0.9.0/go.mod h1:cdorVVzy1fhmEqmtgqkoE3bYtCfSCkVyjTyCIo22xvs= github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/elazarl/goproxy v0.0.0-20181111060418-2ce16c963a8a/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/elazarl/goproxy v0.0.0-20191011121108-aa519ddbe484 h1:pEtiCjIXx3RvGjlUJuCNxNOw0MNblyR9Wi+vJGBFh+8= -github.com/elazarl/goproxy v0.0.0-20191011121108-aa519ddbe484/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= +github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= +github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.6.0+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.10.0+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.11.1+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.15.0+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.16.0+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful/v3 v3.5.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/emicklei/go-restful/v3 v3.8.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.10.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/emicklei/go-restful/v3 v3.10.2 h1:hIovbnmBTLjHXkqEBUz3HGpXZdM7ZrE9fJIZIqlJLqE= github.com/emicklei/go-restful/v3 v3.10.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= +github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -1249,13 +2285,25 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= +github.com/envoyproxy/go-control-plane v0.11.0/go.mod h1:VnHyVMpzcLvCFt9yUz1UnCwHLhwx1WguiVDV7pTG/tI= +github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= +github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= +github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= +github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= +github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= +github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= +github.com/envoyproxy/protoc-gen-validate v1.0.1/go.mod h1:0vj8bNkYbSTNS2PIyH87KZaeN4x9zpL9Qt8fQC7d+vs= +github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= github.com/esimonov/ifshort v1.0.4/go.mod h1:Pe8zjlRrJ80+q2CxHLfEOfTwxCZ4O+MuhcHcfgNWTk0= +github.com/etcd-io/gofail v0.0.0-20190801230047-ad7f989257ca/go.mod h1:49H/RkXP8pKaZy4h0d+NW16rSLhyVBt4o6VLJbmOqDE= github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= github.com/euank/go-kmsg-parser v2.0.0+incompatible/go.mod h1:MhmAMZ8V4CYH4ybgdRwPr2TU5ThnS43puaKEMpja1uw= github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= @@ -1266,43 +2314,58 @@ github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQL github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.5.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= -github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= +github.com/evanphx/json-patch/v5 v5.7.0 h1:nJqP7uwL84RJInrohHfW0Fx3awjbm8qZeFv0nW9SYGc= +github.com/evanphx/json-patch/v5 v5.7.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d h1:105gxyaGwCFad8crR9dcMQWvV9Hvulu6hwUh4tWPJnM= github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a/go.mod h1:7Ga40egUymuWXxAe151lTNnCv97MddSOVsjpPPkityA= +github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= +github.com/facebookgo/limitgroup v0.0.0-20150612190941-6abd8d71ec01/go.mod h1:ypD5nozFk9vcGw1ATYefw6jHe/jZP++Z15/+VTMcWhc= +github.com/facebookgo/muster v0.0.0-20150708232844-fd3d7953fd52/go.mod h1:yIquW87NGRw1FU5p5lEkpnt/QxoH5uPAOUlOVkAUuMg= +github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= +github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb/go.mod h1:bH6Xx7IW64qjjJq8M2u4dxNaBiDfKK+z/3eGDpXEQhc= github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/fatih/structtag v1.0.0/go.mod h1:IKitwq45uXL/yqi5mYghiD3w9H6eTOvI9vnk8tXMphA= github.com/fatih/structtag v1.1.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/favadi/protoc-go-inject-tag v1.3.0/go.mod h1:SSkUBgfqw2IJ2p7NPNKWk0Idwxt/qIt2LQgFPUgRGtc= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/firefart/nonamedreturns v1.0.4/go.mod h1:TDhe/tjI1BXo48CmYbUduTV7BdIga8MAO/xbKdcVsGI= github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= +github.com/flynn/go-docopt v0.0.0-20140912013429-f6dd2ebbb31e/go.mod h1:HyVoz1Mz5Co8TFO8EupIdlcpwShBmY98dkT2xeHkvEI= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/form3tech-oss/jwt-go v3.2.5+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/foxcpp/go-mockdns v0.0.0-20210729171921-fb145fc6f897/go.mod h1:lgRN6+KxQBawyIghpnl5CezHFGS9VLzvtVlwxvzXTQ4= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +github.com/frankban/quicktest v1.2.2/go.mod h1:Qh/WofXFeiAFII1aEBu529AtJo6Zg2VHscnEsbBnJ20= github.com/frankban/quicktest v1.4.0/go.mod h1:36zfPVQyHxymz4cH7wlDmVwDrJuljRB60qkgn7rorfQ= github.com/frankban/quicktest v1.4.1/go.mod h1:36zfPVQyHxymz4cH7wlDmVwDrJuljRB60qkgn7rorfQ= github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/frankban/quicktest v1.13.0/go.mod h1:qLE0fzW0VuyUAJgPU19zByoIr0HtCHN/r/VLSOOIySU= +github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/frankban/quicktest v1.14.2/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= @@ -1315,7 +2378,9 @@ github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbS github.com/fsouza/fake-gcs-server v0.0.0-20180612165233-e85be23bdaa8/go.mod h1:1/HufuJ+eaDf4KTnYdS6HJMGvMRU8d4cYTuu/1QaBbI= github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM= +github.com/fullstorydev/grpcurl v1.8.7/go.mod h1:pVtM4qe3CMoLaIzYS8uvTuDj2jVYmXqMUkZeijnXp/E= github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= +github.com/fxamacker/cbor/v2 v2.4.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= github.com/gabriel-vasile/mimetype v1.3.1/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmxRtOJlERCzSmRvr8= github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= @@ -1326,21 +2391,21 @@ github.com/gammazero/deque v0.0.0-20190130191400-2afb3858e9c7/go.mod h1:GeIq9qoE github.com/gammazero/workerpool v0.0.0-20190406235159-88d534f22b56/go.mod h1:w9RqFVO2BM3xwWEcAB8Fwp0OviTBBEiRmSBDfbXnd3w= github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/garyburd/redigo v1.6.3/go.mod h1:rTb6epsqigu3kYKBnaF028A7Tf/Aw5s0cqA47doKKqw= -github.com/gernest/wow v0.1.0/go.mod h1:dEPabJRi5BneI1Nev1VWo0ZlcTWibHWp43qxKms4elY= github.com/getkin/kin-openapi v0.2.0/go.mod h1:V1z9xl9oF5Wt7v32ne4FmiF1alpS4dM6mNzoywPOXlk= github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getsentry/raven-go v0.1.2/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 h1:Mn26/9ZMNWSw9C9ERFA1PUxfmGpolnw2v0bKOREu5ew= github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= github.com/gizak/termui/v3 v3.1.0/go.mod h1:bXQEBkJpzxUAKf0+xq9MSWAvWZlE7c+aidmyFlkYTrY= +github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-asn1-ber/asn1-ber v1.3.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= @@ -1354,14 +2419,27 @@ github.com/go-critic/go-critic v0.6.5/go.mod h1:ezfP/Lh7MA6dBNn4c6ab5ALv3sKnZVLx github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.1 h1:IvVlgbzSsaUNudsw5dcXSzF3EWyXTi5XrAdngnuhRyg= github.com/go-errors/errors v1.4.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-fed/httpsig v1.1.0/go.mod h1:RCMrTZvN1bJYtofsG4rd5NaO5obxQ5xBkdiS7xsT7bM= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= +github.com/go-git/go-billy/v5 v5.4.1/go.mod h1:vjbugF6Fz7JIflbVpl1hJsGjSHNltrSw45YK/ukIvQg= +github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= +github.com/go-git/go-git/v5 v5.10.0/go.mod h1:1FOZ/pQnqw24ghP2n7cunVl0ON55BsjPYvhWHvZGhoo= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gorp/gorp v2.0.0+incompatible/go.mod h1:7IfkAQnO7jfT/9IQ3R9wL1dFhukN6aQxzKTHnkxzA/E= github.com/go-gorp/gorp/v3 v3.0.2/go.mod h1:BJ3q1ejpV8cVALtcXvXaXyTOlMmJhWDxTmncaR6rwBY= github.com/go-gorp/gorp/v3 v3.1.0 h1:ItKF/Vbuj31dmV4jxA1qblpSwkl9g1typ24xoe70IGs= github.com/go-gorp/gorp/v3 v3.1.0/go.mod h1:dLEjIyyRNiXvNZ8PSmzpt1GsWAUK8kjVhEpjH8TixEw= -github.com/go-ini/ini v1.21.1/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-ini/ini v1.66.6/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-jose/go-jose/v3 v3.0.0/go.mod h1:RNkWWRld676jZEYoV3+XK8L2ZnNSvIsxFMht0mSX+u8= github.com/go-jose/go-jose/v3 v3.0.1 h1:pWmKFVtt+Jl0vBZTIpz/eAKwsm6LkIxDVVbFHKkchhA= github.com/go-jose/go-jose/v3 v3.0.1/go.mod h1:RNkWWRld676jZEYoV3+XK8L2ZnNSvIsxFMht0mSX+u8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= @@ -1373,6 +2451,8 @@ github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vb github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= github.com/go-ldap/ldap v3.0.2+incompatible/go.mod h1:qfd9rJvER9Q0/D/Sqn1DfHRoBp40uXYvFoEVrNEPqRc= github.com/go-ldap/ldap/v3 v3.1.3/go.mod h1:3rbOH3jRS2u6jg2rJnKAMLE/xQyCKIveG2Sa/Cohzb8= github.com/go-ldap/ldap/v3 v3.1.7/go.mod h1:5Zun81jBTabRaI8lzN7E1JjyEl1g6zI6u9pd8luAK4Q= @@ -1395,7 +2475,6 @@ github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= -github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= @@ -1407,6 +2486,8 @@ github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2 github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ= github.com/go-openapi/analysis v0.19.16/go.mod h1:GLInF007N83Ad3m8a/CbQ5TPzdnGT7workfHwuVjNVk= github.com/go-openapi/analysis v0.20.0/go.mod h1:BMchjvaHDykmRMsK40iPtvyOfFdMMxlOmQr9FBZk+Og= +github.com/go-openapi/analysis v0.21.2/go.mod h1:HZwRk4RRisyG8vx2Oe6aqeSQcoxRp47Xkp3+K6q+LdY= +github.com/go-openapi/analysis v0.21.4/go.mod h1:4zQ35W4neeZTqh3ol0rv/O8JBbka9QyAgQRPp9y3pfo= github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.17.2/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= @@ -1422,26 +2503,23 @@ github.com/go-openapi/errors v0.22.0 h1:c4xY/OLxUBSTiepAg3j/MHuAv5mJhnf53LLMWFB+ github.com/go-openapi/errors v0.22.0/go.mod h1:J3DmZScxCDufmIMsdOuDHxJbdOGC0xtUynjIx092vXE= github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4= github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.17.2/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.19.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.17.2/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.19.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= +github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= @@ -1455,6 +2533,8 @@ github.com/go-openapi/loads v0.19.6/go.mod h1:brCsvE6j8mnbmGBh103PT/QLHfbyDxA4hs github.com/go-openapi/loads v0.19.7/go.mod h1:brCsvE6j8mnbmGBh103PT/QLHfbyDxA4hsKvYBNEGVc= github.com/go-openapi/loads v0.20.0/go.mod h1:2LhKquiE513rN5xC6Aan6lYOSddlL8Mp20AW9kpviM4= github.com/go-openapi/loads v0.20.2/go.mod h1:hTVUotJ+UonAMMZsvakEgmWKgtulweO9vYP2bQYKA/o= +github.com/go-openapi/loads v0.21.1/go.mod h1:/DtAMXXneXFjbQMGEtbamCZb+4x7eGwkvZCvBmwUG+g= +github.com/go-openapi/loads v0.21.2/go.mod h1:Jq58Os6SSGz0rzh62ptiu8Z31I+OTHqmULx5e/gJbNw= github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= github.com/go-openapi/runtime v0.18.0/go.mod h1:uI6pHuxWYTy94zZxgcwJkUWa9wbIlhteGfloI10GD4U= github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= @@ -1462,7 +2542,8 @@ github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29g github.com/go-openapi/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo= github.com/go-openapi/runtime v0.19.16/go.mod h1:5P9104EJgYcizotuXhEuUrzVc+j1RiSjahULvYmlv98= github.com/go-openapi/runtime v0.19.24/go.mod h1:Lm9YGCeecBnUUkFTxPC4s1+lwrkJ0pthx8YvyjCfkgk= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= +github.com/go-openapi/runtime v0.23.1/go.mod h1:AKurw9fNre+h3ELZfk6ILsfvPN+bvvlaU/M9q/r9hpk= +github.com/go-openapi/runtime v0.25.0/go.mod h1:Ux6fikcHXyyob6LNWxtE96hWwjBPYF0DXgVFuMTneOs= github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.17.2/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= @@ -1475,8 +2556,12 @@ github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHK github.com/go-openapi/spec v0.19.15/go.mod h1:+81FIL1JwC5P3/Iuuozq3pPE9dXdIEGxFutcFKaVbmU= github.com/go-openapi/spec v0.20.0/go.mod h1:+81FIL1JwC5P3/Iuuozq3pPE9dXdIEGxFutcFKaVbmU= github.com/go-openapi/spec v0.20.1/go.mod h1:93x7oh+d+FQsmsieroS4cmR3u0p/ywH649a3qwC9OsQ= -github.com/go-openapi/spec v0.20.3 h1:uH9RQ6vdyPSs2pSy9fL8QPspDF2AMIMPtmK5coSSjtQ= github.com/go-openapi/spec v0.20.3/go.mod h1:gG4F8wdEDN+YPBMVnzE85Rbhf+Th2DTvA9nFPQ5AYEg= +github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= +github.com/go-openapi/spec v0.20.6/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= +github.com/go-openapi/spec v0.20.7/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= +github.com/go-openapi/spec v0.20.8 h1:ubHmXNY3FCIOinT8RNrrPfGc9t7I1qhPtdOGoG2AxRU= +github.com/go-openapi/spec v0.20.8/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.17.2/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= @@ -1488,11 +2573,13 @@ github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk github.com/go-openapi/strfmt v0.19.11/go.mod h1:UukAYgTaQfqJuAFlNxxMWNvMYiwiXtLsF2VwmoFtbtc= github.com/go-openapi/strfmt v0.20.0/go.mod h1:UukAYgTaQfqJuAFlNxxMWNvMYiwiXtLsF2VwmoFtbtc= github.com/go-openapi/strfmt v0.20.1/go.mod h1:43urheQI9dNtE5lTZQfuFJvjYJKPrxicATpEfZwHUNk= +github.com/go-openapi/strfmt v0.21.0/go.mod h1:ZRQ409bWMj+SOgXofQAGTIo2Ebu72Gs+WaRADcS5iNg= +github.com/go-openapi/strfmt v0.21.1/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k= +github.com/go-openapi/strfmt v0.21.2/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k= github.com/go-openapi/strfmt v0.21.3/go.mod h1:k+RzNO0Da+k3FrrynSNN8F7n/peCmQQqbbXjtDfvmGg= github.com/go-openapi/strfmt v0.21.7/go.mod h1:adeGTkxE44sPyLk0JV235VQAO/ZXUr8KAzYjclFs3ew= github.com/go-openapi/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c= github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.17.2/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= @@ -1503,6 +2590,7 @@ github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfT github.com/go-openapi/swag v0.19.12/go.mod h1:eFdyEBkTdoAf/9RXBvj4cr1nH7GD8Kzo5HTt47gr72M= github.com/go-openapi/swag v0.19.13/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= @@ -1515,26 +2603,45 @@ github.com/go-openapi/validate v0.19.12/go.mod h1:Rzou8hA/CBw8donlS6WNEUQupNvUZ0 github.com/go-openapi/validate v0.19.15/go.mod h1:tbn/fdOwYHgrhPBzidZfJC2MIVvs9GA7monOmWBbeCI= github.com/go-openapi/validate v0.20.1/go.mod h1:b60iJT+xNNLfaQJUqLI7946tYiFEOuE9E4k54HpKcJ0= github.com/go-openapi/validate v0.20.2/go.mod h1:e7OJoKNgd0twXZwIn0A43tHbvIcr/rZIVCbJBpTUoY0= +github.com/go-openapi/validate v0.21.0/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg= +github.com/go-openapi/validate v0.22.0/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg= +github.com/go-openapi/validate v0.22.1/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg= github.com/go-ozzo/ozzo-validation v3.5.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU= github.com/go-ozzo/ozzo-validation v3.6.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU= +github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= github.com/go-playground/validator/v10 v10.19.0 h1:ol+5Fu+cSq9JD7SoSqe04GMI92cbn0+wvQ3bZ8b/AU4= github.com/go-playground/validator/v10 v10.19.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= +github.com/go-resty/resty/v2 v2.1.1-0.20191201195748-d7b97669fe48/go.mod h1:dZGr0i9PLlaaTD4H/hoZIDjQ+r6xq8mgbRzHZf7f2J8= +github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= +github.com/go-rod/rod v0.112.9/go.mod h1:l0or0gEnZ7E5C0L/W7iD+yXBnm/OM3avP1ji74k8N9s= +github.com/go-rod/rod v0.114.5/go.mod h1:aiedSEFg5DwG/fnNbUOTPMTTWX3MRj6vIs/a684Mthw= github.com/go-sql-driver/mysql v0.0.0-20160411075031-7ebe0a500653/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= +github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= @@ -1543,8 +2650,9 @@ github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr6 github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/go-test/deep v1.0.4/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= -github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= +github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg= +github.com/go-test/deep v1.1.0/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= github.com/go-toolsmith/astcopy v1.0.2/go.mod h1:4TcEdbElGc9twQEYpVo/aieIXfHhiuLh4aLAck6dO7Y= github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= @@ -1557,30 +2665,42 @@ github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslW github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= +github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= +github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= +github.com/gobuffalo/attrs v1.0.2/go.mod h1:tJ7wJj6XbMNhYwJ8fl2PFDpDcUfsG1spWdUJISvPAZQ= github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= github.com/gobuffalo/envy v1.7.1/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w= +github.com/gobuffalo/envy v1.10.1/go.mod h1:AWx4++KnNOW3JOeEvhSaq+mvgAvnMYOY1XSIin4Mago= +github.com/gobuffalo/fizz v1.14.2/go.mod h1:pZp2NZYEiPRoylV3lKIz0XZOOupizz+SnKq9wb1idxE= github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= github.com/gobuffalo/flect v0.1.5/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= +github.com/gobuffalo/flect v0.2.4/go.mod h1:1ZyCLIbg0YD7sDkzvFdPoOydPtD8y9JQnrOROolUcM8= +github.com/gobuffalo/flect v0.2.5/go.mod h1:1ZyCLIbg0YD7sDkzvFdPoOydPtD8y9JQnrOROolUcM8= +github.com/gobuffalo/flect v0.3.0/go.mod h1:5pf3aGnsvqvCj50AVni7mJJF8ICxGZ8HomberC3pXLE= github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= +github.com/gobuffalo/genny/v2 v2.0.12/go.mod h1:KtMtTcR/U2kHbQxhjCVA16ph6rjBnhw39f6aaxl4hMk= github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= +github.com/gobuffalo/github_flavored_markdown v1.1.1/go.mod h1:yU32Pen+eorS58oxh/bNZx76zUOCJwmvyV5FBrvzOKQ= github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= +github.com/gobuffalo/helpers v0.6.5/go.mod h1:LA4zcc89tkZsfKpJIWsXLibiqTgZQ4EvDszfxdqr9ZA= github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= github.com/gobuffalo/logger v1.0.0/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8ze5s8JvPs= github.com/gobuffalo/logger v1.0.6 h1:nnZNpxYo0zx+Aj9RfMPBm+x9zAU2OayFh/xrAWi34HU= github.com/gobuffalo/logger v1.0.6/go.mod h1:J31TBEHR1QLV2683OXTAItYIg8pv2JMHnF/quuAbMjs= github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/nulls v0.4.1/go.mod h1:pp8e1hWTRJZFpMl4fj/CVbSMlaxjeGKkFq4RuBZi3w8= github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q= @@ -1594,11 +2714,19 @@ github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/V github.com/gobuffalo/packr/v2 v2.5.1/go.mod h1:8f9c96ITobJlPzI44jj+4tHnEKNt0xXWSVlXRN9X1Iw= github.com/gobuffalo/packr/v2 v2.8.3 h1:xE1yzvnO56cUC0sTpKR3DIbxZgB54AftTFMhB2XEWlY= github.com/gobuffalo/packr/v2 v2.8.3/go.mod h1:0SahksCVcx4IMnigTjiFuyldmTrdTctXsOdiU5KwbKc= +github.com/gobuffalo/plush/v4 v4.1.13/go.mod h1:s3hUyj/JlwEiJ039OBJevojq9xT40D1pgekw0o88CVU= +github.com/gobuffalo/pop/v6 v6.0.6/go.mod h1:toTxNJnsSuSlyK6w0yGb4YXSNIHsi2chQYC2CjBF9Ac= github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= +github.com/gobuffalo/tags/v3 v3.1.3/go.mod h1:WAAjKdskZUmdi6EkNjP2SXBwBwRovHsjJsPJbBiPlKc= +github.com/gobuffalo/validate/v3 v3.3.2/go.mod h1:jiEEw+N7KbAP2aInFxGnfitI0g7HjXqcp5hDD6TaQDU= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-yaml v1.9.5/go.mod h1:U/jl18uSupI5rdI2jmuCswEA2htH9eXfferR3KfscvA= +github.com/goccy/kpoward v0.1.0/go.mod h1:m13lkcWSvNXtYC9yrXzguwrt/YTDAGioPusndMdQ+eA= github.com/gocql/gocql v0.0.0-20190402132108-0e1d5de854df/go.mod h1:4Fw1eo5iaEhDUs8XyuhSVCVy52Jq3L+/3GJgYkwc+/0= github.com/gocql/gocql v1.0.0/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8= github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= @@ -1607,12 +2735,15 @@ github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6 github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godror/godror v0.24.2/go.mod h1:wZv/9vPiUib6tkoDl+AZ/QLf5YZgMravZ7jxH2eQWAE= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0= +github.com/gofrs/uuid v4.1.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v4.3.1+incompatible h1:0/KbAdpx3UXAx1kEOWHJeOkpbgRFGHVgv+CFIY7dBJI= +github.com/gofrs/uuid v4.3.1+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= @@ -1629,10 +2760,12 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= -github.com/golang-jwt/jwt v3.2.1+incompatible h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfEP4Q1lOd9Z/+c= +github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJUE= @@ -1642,10 +2775,11 @@ github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EO github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= +github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20180924190550-6f2cf27854a4/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -1665,7 +2799,6 @@ github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71 github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -1712,6 +2845,15 @@ github.com/golangplus/testing v1.0.0/go.mod h1:ZDreixUV3YzhoVraIDyOzHrr76p6NUh6k github.com/gomodule/redigo v1.7.0/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/gomodule/redigo v1.8.2 h1:H5XSIre1MB5NbPYFp+i1NBbb5qN1W8Y8YAQoAYbkm8k= github.com/gomodule/redigo v1.8.2/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0= +github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac/go.mod h1:P32wAyui1PQ58Oce/KYkOqQv8cVw1zAapXOl+dRFGbc= +github.com/gonum/diff v0.0.0-20181124234638-500114f11e71/go.mod h1:22dM4PLscQl+Nzf64qNBurVJvfyvZELT0iRW2l/NN70= +github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82/go.mod h1:PxC8OnwL11+aosOB5+iEPoV3picfs8tUpkVd0pDo+Kg= +github.com/gonum/integrate v0.0.0-20181209220457-a422b5c0fdf2/go.mod h1:pDgmNM6seYpwvPos3q+zxlXMsbve6mOIPucUnUOrI7Y= +github.com/gonum/internal v0.0.0-20181124074243-f884aa714029/go.mod h1:Pu4dmpkhSyOzRwuXkOgAvijx4o+4YMUJJo9OvPYMkks= +github.com/gonum/lapack v0.0.0-20181123203213-e4cdc5a0bff9/go.mod h1:XA3DeT6rxh2EAE789SSiSJNqxPaC0aE9J8NTOI0Jo/A= +github.com/gonum/mathext v0.0.0-20181121095525-8a4bf007ea55/go.mod h1:fmo8aiSEWkJeiGXUJf+sPvuDgEFgqIoZSs843ePKrGg= +github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9/go.mod h1:0EXg4mc1CNP0HCqCz+K4ts155PXIlUywf0wqN+GfPZw= +github.com/gonum/stat v0.0.0-20181125101827-41a0da705a5b/go.mod h1:Z4GIJBJO3Wa4gD4vbwQxXXZ+WHmW6E9ixmNrwvs0iZs= github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -1725,12 +2867,18 @@ github.com/google/cel-go v0.18.1 h1:V/lAXKq4C3BYLDy/ARzMtpkEEYfHQpZzVyzy69nEUjs= github.com/google/cel-go v0.18.1/go.mod h1:PVAybmSnWkNMUZR/tEWFUiJ1Np4Hz0MHsZJcgC4zln4= github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= +github.com/google/certificate-transparency-go v1.0.22-0.20181127102053-c25855a82c75/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= github.com/google/certificate-transparency-go v1.1.1/go.mod h1:FDKqPvSXawb2ecErVRrD+nfy23RCzyl7eqVCEmlT1Zs= +github.com/google/certificate-transparency-go v1.1.6/go.mod h1:0OJjOsOk+wj6aYQgP7FU0ioQ0AJUmnWPFMqTjQeazPQ= +github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v1.12.1/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/flatbuffers v2.0.0+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.2.1-0.20190312032427-6f77996f0c42/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -1749,25 +2897,38 @@ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-containerregistry v0.0.0-20191010200024-a3d713f9b7f8/go.mod h1:KyKXa9ciM8+lgMXwOVsXi7UxGrsf9mM61Mzs+xKUrKE= github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= +github.com/google/go-containerregistry v0.6.0/go.mod h1:euCCtNbZ6tKqi1E72vwDj2xZcN5ttKpZLfa/wSo5iLw= +github.com/google/go-containerregistry v0.14.0/go.mod h1:aiJ2fp/SXvkWgmYHioXnbMdlgB8eXiiYOY55gfN91Wk= +github.com/google/go-containerregistry v0.15.2/go.mod h1:wWK+LnOv4jXMM23IT/F1wdYftGWGr47Is8CG+pmHK1Q= github.com/google/go-containerregistry v0.17.0 h1:5p+zYs/R4VGHkhyvgWurWrpJ2hW4Vv9fQI+GzdcwXLk= github.com/google/go-containerregistry v0.17.0/go.mod h1:u0qB2l7mvtWVR5kNcbFIhFY1hLbf8eeGapA+vbFDCtQ= +github.com/google/go-containerregistry/pkg/authn/k8schain v0.0.0-20230625233257-b8504803389b/go.mod h1:Ek+8PQrShkA7aHEj3/zSW33wU0V/Bx3zW/gFh7l21xY= +github.com/google/go-containerregistry/pkg/authn/kubernetes v0.0.0-20230516205744-dbecb1de8cfa/go.mod h1:KdL98/Va8Dy1irB6lTxIRIQ7bQj4lbrlvqUzKEQ+ZBU= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= +github.com/google/go-github/v27 v27.0.6/go.mod h1:/0Gr8pJ55COkmv+S/yPKCczSkUPIM/LnFyubufRNIS0= +github.com/google/go-github/v50 v50.2.0/go.mod h1:VBY8FB6yPIjrtKhozXv4FQupxKLS6H4m6xFZlT43q8Q= +github.com/google/go-licenses v0.0.0-20200602185517-f29a4c695c3d/go.mod h1:g1VOUGKZYIqe8lDq2mL7plhAWXqrEaGUs7eIjthN1sk= +github.com/google/go-licenses v1.6.0/go.mod h1:Z8jgz2isEhdenOqd/00pq7I4y4k1xVVQJv415otjclo= github.com/google/go-metrics-stackdriver v0.2.0/go.mod h1:KLcPyp3dWJAFD+yHisGlJSZktIsTjb50eB72U2YZ9K0= +github.com/google/go-pkcs11 v0.2.0/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= +github.com/google/go-pkcs11 v0.2.1-0.20230907215043-c6f79328ddf9/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/go-replayers/grpcreplay v0.1.0 h1:eNb1y9rZFmY4ax45uEEECSa8fsxGRU+8Bil52ASAwic= github.com/google/go-replayers/grpcreplay v0.1.0/go.mod h1:8Ig2Idjpr6gifRd6pNVggX6TC1Zw6Jx74AKp7QNH2QE= -github.com/google/go-replayers/httpreplay v0.1.0 h1:AX7FUb4BjrrzNvblr/OlgwrmFiep6soj5K2QSDW7BGk= github.com/google/go-replayers/httpreplay v0.1.0/go.mod h1:YKZViNhiGgqdBlUbI2MwGpq4pXxNmhJLPHQ7cv2b5no= -github.com/google/gofuzz v0.0.0-20150304233714-bbcb9da2d746/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= -github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/go-replayers/httpreplay v1.1.1 h1:H91sIMlt1NZzN7R+/ASswyouLJfW0WLW7fhyUFvDEkY= +github.com/google/go-replayers/httpreplay v1.1.1/go.mod h1:gN9GeLIs7l6NUoVaSSnv2RiqK1NiwAmD0MrKeC9IIks= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/licenseclassifier v0.0.0-20190926221455-842c0d70d702/go.mod h1:qsqn2hxC+vURpyBRygGUuinTO42MFRLcsmQ/P8v94+M= +github.com/google/licenseclassifier v0.0.0-20210722185704-3043a050f148/go.mod h1:rq9F0RSpNKlrefnf6ZYMHKUnEJBCNzf6AcCXMYBeYvE= +github.com/google/mako v0.0.0-20190821191249-122f8dcef9e3/go.mod h1:YzLcVlL+NqWnmUEPuhS1LxDDwGO9WNbVlEXaF4IH35g= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible h1:xmapqc1AyLoB+ddYT6r04bD9lIjlOqGaREovi0SzFaE= github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= @@ -1776,7 +2937,7 @@ github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIG github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20180605153948-8b03ce837f34/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20181127221834-b4f47329b966/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190723021845-34ac40c74b70/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -1792,20 +2953,26 @@ github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20220318212150-b2ab0324ddda/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= +github.com/google/pprof v0.0.0-20221103000818-d260c55eee4c/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= github.com/google/pprof v0.0.0-20230228050547-1710fef4ab10 h1:CqYfpuYIjnlNxM3msdyPRKabhXZWbKjf3Q8BWROFBso= github.com/google/pprof v0.0.0-20230228050547-1710fef4ab10/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.0/go.mod h1:OJpEgntRZo8ugHpF9hkoLJbS5dSI20XZeXJ9JVywLlM= +github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= -github.com/google/shlex v0.0.0-20181106134648-c34317bd91bf/go.mod h1:RpwtwJQFrIEPstU94h88MWPXP2ektJZ8cZ0YntAmXiE= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/tink/go v1.6.1/go.mod h1:IGW53kTgag+st5yPhKKwJ6u2l+SSp5/v9XF7spovjlY= github.com/google/trillian v1.3.11/go.mod h1:0tPraVHrSDkA3BO6vKX67zgLXs6SsOAbHEivX+9mPgw= +github.com/google/trillian v1.5.2/go.mod h1:H8vOoa2dxd3xCdMzOOwt9kIz/3MSoJhcqLJGG8iRwbg= github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v0.0.0-20170306145142-6a5e28554805/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -1814,13 +2981,21 @@ github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/wire v0.4.0 h1:kXcsA/rIGzJImVqPdhfnr6q0xsS9gU0515q1EPpJ9fE= github.com/google/wire v0.4.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= +github.com/googleapis/cloud-bigtable-clients-test v0.0.0-20221104150409-300c96f7b1f5/go.mod h1:Udm7et5Lt9Xtzd4n07/kKP80IdlR4zVDjtlUZEO2Dd8= github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.4/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= @@ -1836,27 +3011,29 @@ github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.9.1/go.mod h1:4FG3gMrVZlyMp5itSYKMU9z/lBE7+SbnUOvzH2HqbEY= +github.com/googleapis/gax-go/v2 v2.10.0/go.mod h1:4UOEnMCrxsSqQ940WnTiD6qJ63le2ev3xfyagutxiPw= +github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/gax-go/v2 v2.12.1 h1:9F8GV9r9ztXyAi00gsMQHNoF51xPZm8uj1dpYt2ZETM= github.com/googleapis/gax-go/v2 v2.12.1/go.mod h1:61M8vcyyXR2kqKFxKrfA22jaA8JGF7Dc8App1U3H6jc= -github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.0.0-20180520015035-48a0ecefe2e4/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.2.2/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gookit/color v1.5.1/go.mod h1:wZFzea4X8qN6vHOSP2apMb4/+w/orMznEzYsIHPaqKM= -github.com/gophercloud/gophercloud v0.0.0-20190301152420-fca40860790e/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gophercloud/gophercloud v0.3.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gophercloud/gophercloud v0.6.0/go.mod h1:GICNByuaEBibcjmjvI7QvYJSZEbGkcYwAR7EZK2WMqM= +github.com/gophercloud/gophercloud v0.24.0/go.mod h1:Q8fZtyi5zZxPS/j9aj3sSxtvj41AdQMDwyo1myduD5c= +github.com/gophercloud/gophercloud v1.2.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= github.com/gopherjs/gopherjs v0.0.0-20180628210949-0892b62f0d9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20191106031601-ce3c9ade29de/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 h1:l5lAOZEym3oK3SQ2HBHWsJUfbNBiTXJDeW2QDxw9AQ0= github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -1865,6 +3042,7 @@ github.com/gordonklaus/ineffassign v0.0.0-20210914165742-4cc7213b9bc8/go.mod h1: github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/csrf v1.6.2/go.mod h1:7tSf8kmjNYr7IWDCYhd3U8Ck34iQ/Yw5CJu7bAkHEGI= +github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= @@ -1899,6 +3077,8 @@ github.com/gostaticanalysis/testutil v0.4.0/go.mod h1:bLIoPefWXrRi/ssLFWX1dx7Rep github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= +github.com/grafana/regexp v0.0.0-20220304095617-2e8d9baf4ac2/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= +github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20181110185634-c63ab54fda8f/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20190212212710-3befbb6ad0cc/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= @@ -1912,42 +3092,42 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaD github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= -github.com/grpc-ecosystem/go-grpc-prometheus v0.0.0-20181025070259-68e3a13e4117/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.4.1/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.6.2/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= -github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.4/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.11.3/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2/go.mod h1:7pdNwVWBBHGiCxa9lAszqCJMbfTISJ7oMftp8+UGV08= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is= github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM= -github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= github.com/hashicorp/cap v0.0.0-20220502204956-9a9f4a9d6e61/go.mod h1:zb3VvIFA0lM2lbmO69NjowV9dJzJnZS89TaM9blXPJA= github.com/hashicorp/cap v0.2.1-0.20220727210936-60cd1534e220/go.mod h1:zb3VvIFA0lM2lbmO69NjowV9dJzJnZS89TaM9blXPJA= -github.com/hashicorp/consul v1.4.4/go.mod h1:mFrjN1mfidgJfYP1xrJCF+AfRhr6Eaqhb2+sfyn/OOI= github.com/hashicorp/consul-template v0.25.0/go.mod h1:/vUsrJvDuuQHcxEw0zik+YXTS7ZKWZjQeaQhshBmfH0= github.com/hashicorp/consul-template v0.29.5/go.mod h1:SZGBPz/t0JaBwMOqM6q/mG66cBRA8IeDUjOwjO0Pa5M= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/api v1.4.0/go.mod h1:xc8u05kyMa3Wjr9eEAsIAo3dg8+LywT5E/Cl7cNS5nU= -github.com/hashicorp/consul/api v1.8.1/go.mod h1:sDjTOq0yUyv5G4h+BqSea7Fn6BU+XbolEz1952UB+mk= +github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= github.com/hashicorp/consul/api v1.15.2/go.mod h1:v6nvB10borjOuIwNRZYPZiHKrTM/AyrGtd0WVVodKM8= +github.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.4.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM= -github.com/hashicorp/consul/sdk v0.7.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM= github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/consul/sdk v0.11.0/go.mod h1:yPkX5Q6CsxTFMjQQDJwzeNmUUF5NUGGbrDsv9wTb8cw= +github.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0= github.com/hashicorp/cronexpr v1.1.1/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A= github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= @@ -2025,9 +3205,9 @@ github.com/hashicorp/go-retryablehttp v0.6.6/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER github.com/hashicorp/go-retryablehttp v0.6.7/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-retryablehttp v0.7.0/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-retryablehttp v0.7.1/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/go-retryablehttp v0.7.2/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= github.com/hashicorp/go-retryablehttp v0.7.5 h1:bJj+Pj19UZMIweq/iie+1u5YCdGrnxCT9yvm0e+Nd5M= github.com/hashicorp/go-retryablehttp v0.7.5/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= -github.com/hashicorp/go-rootcerts v0.0.0-20160503143440-6bb64b370b90/go.mod h1:o4zcYY1e0GEZI6eSEr+43QDYmuGglw1qSO6qdHUHCgg= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= @@ -2058,6 +3238,7 @@ github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0S github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-tfe v0.20.0/go.mod h1:gyXLXbpBVxA2F/6opah8XBsOkZJxHYQmghl0OWi8keI= +github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2-0.20191001231223-f32f5fe8d6a8/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= @@ -2068,6 +3249,7 @@ github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09 github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.3.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.4.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.5.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= @@ -2075,6 +3257,7 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= @@ -2092,8 +3275,10 @@ github.com/hashicorp/memberlist v0.1.5/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2p github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/memberlist v0.3.1/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= github.com/hashicorp/nomad/api v0.0.0-20191220223628-edc62acd919d/go.mod h1:WKCL+tLVhN1D+APwH3JiTRZoxcdwRk86bWu1LVCUPaE= github.com/hashicorp/nomad/api v0.0.0-20220707195938-75f4c2237b28/go.mod h1:FslB+3eLbZgkuPWffqO1GeNzBFw1SuVqN2PXsMNe0Fg= +github.com/hashicorp/nomad/api v0.0.0-20230308192510-48e7d70fcd4b/go.mod h1:bKUb1ytds5KwUioHdvdq9jmrDqCThv95si0Ub7iNeBg= github.com/hashicorp/nomad/api v0.0.0-20240209231933-e2bfdf0c1034 h1:fjLDHVq+R77B8DPhw4mNQc9loPjgBPwODqp06SHZWfA= github.com/hashicorp/nomad/api v0.0.0-20240209231933-e2bfdf0c1034/go.mod h1:ijDwa6o1uG1jFSq6kERiX2PamKGpZzTmo0XOFNeFZgw= github.com/hashicorp/raft v1.0.1/go.mod h1:DVSAWItjLjTOkVbSpWQ0j0kUADIvDaCtBxIcbNAQLkI= @@ -2112,6 +3297,7 @@ github.com/hashicorp/serf v0.8.5/go.mod h1:UpNcs7fFbpKIyZaUuSW6EPiH+eZC7OuyFD+wc github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/hashicorp/vault v1.4.2/go.mod h1:500fLOj7p92Ys4X265LizqF78MzmHJUf1jV1zNJt060= github.com/hashicorp/vault v1.12.2/go.mod h1:8vvin/hC1qj3wIiW2TDS5nwgmkXYMf6H1Qje69OI/mw= github.com/hashicorp/vault-plugin-auth-alicloud v0.5.5/go.mod h1:sQ+VNwPQlemgXHXikYH6onfH9gPwDZ1GUVRLz0ZvHx8= @@ -2177,6 +3363,7 @@ github.com/hashicorp/vault/api v1.3.1/go.mod h1:QeJoWxMFt+MsuWcYhmwRLwKEXrjwAFFy github.com/hashicorp/vault/api v1.5.0/go.mod h1:LkMdrZnWNrFaQyYYazWVn7KshilfDidgVBq6YiTq/bM= github.com/hashicorp/vault/api v1.7.2/go.mod h1:xbfA+1AvxFseDzxxdWaL0uO99n1+tndus4GCrtouy0M= github.com/hashicorp/vault/api v1.8.0/go.mod h1:uJrw6D3y9Rv7hhmS17JQC50jbPDAZdjZoTtrCCxxs7E= +github.com/hashicorp/vault/api v1.9.1/go.mod h1:78kktNcQYbBGSrOjQfHjXN32OhhxXnbYl3zxpd2uPUs= github.com/hashicorp/vault/api v1.10.0 h1:/US7sIjWN6Imp4o/Rj1Ce2Nr5bki/AXi9vAW3p2tOJQ= github.com/hashicorp/vault/api v1.10.0/go.mod h1:jo5Y/ET+hNyz+JnKDt8XLAdKs+AM0G5W0Vp1IrFI8N8= github.com/hashicorp/vault/api/auth/approle v0.1.0/go.mod h1:mHOLgh//xDx4dpqXoq6tS8Ob0FoCFWLU2ibJ26Lfmag= @@ -2214,7 +3401,11 @@ github.com/heptio/ark v1.0.0 h1:5nXmMxT4gIYBpX5SR0t5jtGpafFKUoumwbfaLd/f6A0= github.com/heptio/ark v1.0.0/go.mod h1:rAijmSLOn6qs7oJI4Ck6M7/GSBqQ9RDYou4CgykNyQc= github.com/heptio/velero v1.0.0 h1:5xFd2mieexakJiaxo5SgIAGXfgj+o+9QTIDm0vWpWVs= github.com/heptio/velero v1.0.0/go.mod h1:Q8aj4N9pmvDNp2hWmqWJ1Z1ybUjEI+iQOP3C9hx2njQ= +github.com/hetznercloud/hcloud-go v1.33.1/go.mod h1:XX/TQub3ge0yWR2yHWmnDVIrB+MQbda1pHxkUmDlUME= +github.com/hetznercloud/hcloud-go v1.41.0/go.mod h1:NaHg47L6C77mngZhwBG652dTAztYrsZ2/iITJKhQkHA= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= +github.com/honeycombio/beeline-go v1.10.0/go.mod h1:Zz5WMeQCJzFt2Mvf8t6HC1X8RLskLVR/e8rvcmXB1G8= +github.com/honeycombio/libhoney-go v1.16.0/go.mod h1:izP4fbREuZ3vqC4HlCAmPrcPT9gxyxejRjGtCYpmBn0= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= @@ -2222,10 +3413,14 @@ github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= github.com/iancoleman/strcase v0.1.3/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= +github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= +github.com/ianlancetaylor/demangle v0.0.0-20220517205856-0058ec4f073c/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= github.com/imdario/mergo v0.0.0-20171009183408-7fe0c75c13ab/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= @@ -2237,13 +3432,11 @@ github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= -github.com/improbable-eng/thanos v0.5.0/go.mod h1:RXlsWB7YlTbhIod//QDyd5cBZsnEN0jROXZJY/ol4nk= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/influxdb v0.0.0-20161215172503-049f9b42e9a5/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= -github.com/influxdata/influxdb v0.0.0-20170331210902-15e594fc09f1/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= github.com/influxdata/influxdb v0.0.0-20190411212539-d24b7ba8c4c4/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= github.com/influxdata/influxdb v1.7.6/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= github.com/influxdata/influxdb v1.7.7/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= @@ -2253,7 +3446,10 @@ github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= +github.com/influxdata/tdigest v0.0.0-20180711151920-a7d76c6f093a/go.mod h1:9GkyshztGufsdPQWjH+ifgnIr3xNUL5syI70g2dzU1o= github.com/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9FCCAVRQ= +github.com/intel/goresctrl v0.3.0/go.mod h1:fdz3mD85cmP9sHD8JUlrNWAxvwM86CrbmVXltEKd7zk= +github.com/ionos-cloud/sdk-go/v6 v6.1.4/go.mod h1:Ox3W0iiEz0GHnfY9e5LmAxwklsxguuNFEUSu0gVRTME= github.com/ishidawataru/sctp v0.0.0-20190723014705-7c296d48a2b5/go.mod h1:DM4VvS+hD/kDi1U1QsX2fnZowwBhqD0Dk3bRPKF/Oc8= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= github.com/j-keck/arping v1.0.2/go.mod h1:aJbELhR92bSk7tp79AWM/ftfc90EfEi2bQJrbBFOsPw= @@ -2268,8 +3464,10 @@ github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsU github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -github.com/jackc/pgconn v1.11.0 h1:HiHArx4yFbwl91X3qqIHtUFoiIfLNJXCQRsnzkiwwaQ= github.com/jackc/pgconn v1.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +github.com/jackc/pgconn v1.12.0/go.mod h1:ZkhRC59Llhrq3oSfrikvwQ5NaxYExr6twkdkMLaKono= +github.com/jackc/pgconn v1.12.1 h1:rsDFzIpRk7xT4B8FufgpCCeyjdNpKyghZeSefViE5W8= +github.com/jackc/pgconn v1.12.1/go.mod h1:ZkhRC59Llhrq3oSfrikvwQ5NaxYExr6twkdkMLaKono= github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= @@ -2285,34 +3483,41 @@ github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvW github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.2.0 h1:r7JypeP2D3onoQTCxWdTpCtJ4D+qpKr0TxvoyMhZ5ns= github.com/jackc/pgproto3/v2 v2.2.0/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.3.0 h1:brH0pCGBDkBW07HWlN/oSBXrmo3WB0UvZd1pIuDcL8Y= +github.com/jackc/pgproto3/v2 v2.3.0/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= -github.com/jackc/pgtype v1.10.0 h1:ILnBWrRMSXGczYvmkYD6PsYyVFUNLTnIUJHHDLmqk38= github.com/jackc/pgtype v1.10.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= -github.com/jackc/pgx v3.2.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= +github.com/jackc/pgtype v1.11.0 h1:u4uiGPz/1hryuXzyaBhSk6dnIyyG2683olG2OV+UUgs= +github.com/jackc/pgtype v1.11.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= github.com/jackc/pgx v3.3.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= -github.com/jackc/pgx/v4 v4.15.0 h1:B7dTkXsdILD3MF987WGGCcg+tvLW6bZJdEcqVFeU//w= github.com/jackc/pgx/v4 v4.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= +github.com/jackc/pgx/v4 v4.16.0/go.mod h1:N0A9sFdWzkw/Jy1lwoiB64F2+ugFZi987zRxcPez/wI= +github.com/jackc/pgx/v4 v4.16.1 h1:JzTglcal01DrghUqt+PmzWsZx/Yh7SC/CTQmSBMTd0Y= +github.com/jackc/pgx/v4 v4.16.1/go.mod h1:SIhx0D5hoADaiXZVyv+3gSm3LCIIINTVO0PficsvWGQ= +github.com/jackc/pgx/v5 v5.2.0/go.mod h1:Ptn7zmohNsWEsdxRawMzk3gaKma2obW+NWTnKa0S4nk= github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle/v2 v2.1.2/go.mod h1:2lpufsF5mRHO6SuZkm0fNYxM6SWHfvyFj62KwNzgels= github.com/jarcoal/httpmock v0.0.0-20180424175123-9c70cfe4a1da/go.mod h1:ks+b9deReOc7jgqp+e7LuFiCBH6Rm5hL32cLcEAArb4= github.com/jarcoal/httpmock v1.0.7/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jcmturner/aescts v1.0.1/go.mod h1:k9gJoDUf1GH5r2IBtBjwjDCoLELYxOcEhitdP8RL7qQ= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= github.com/jcmturner/dnsutils v1.0.1/go.mod h1:tqMo38L01jO8AKxT0S9OQVlGZu3dkEt+z5CA+LOhwB0= github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= github.com/jcmturner/gokrb5/v8 v8.0.0/go.mod h1:4/sqKY8Yzo/TIQ8MoCyk/EPcjb+czI9czxHcdXuZbFA= @@ -2322,19 +3527,30 @@ github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJk github.com/jeffchao/backoff v0.0.0-20140404060208-9d7fd7aa17f2/go.mod h1:xkfESuHriIekR+4RoV+fu91j/CfnYM29Zi2tMFw5iD4= github.com/jefferai/isbadcipher v0.0.0-20190226160619-51d2077c035f/go.mod h1:3J2qVK16Lq8V+wfiL2lPeDZ7UWMxk5LemerHa1p6N00= github.com/jefferai/jsonx v1.0.0/go.mod h1:OGmqmi2tTeI/PS+qQfBDToLHHJIy/RMp24fPo8vFvoQ= +github.com/jellydator/ttlcache/v3 v3.0.1/go.mod h1:WwTaEmcXQ3MTjOm4bsZoDFiCu/hMvNWLO1w67RXz6h4= +github.com/jellydator/ttlcache/v3 v3.1.1/go.mod h1:hi7MGFdMAwZna5n2tuvh63DvFLzVKySzCVW6+0gA2n4= +github.com/jenkins-x/go-scm v1.14.24/go.mod h1:lKqSATMN9YB1Dbl8s8tzaUf5AFlAd+JRFipu2M6Ut2Y= github.com/jessevdk/go-flags v0.0.0-20180331124232-1c38ed7ad0cc/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/jetstack/cert-manager v1.7.3 h1:GMbRmyEqKf/ve0TQIXIOjbokdm805rj3uWRlifJnd6U= github.com/jetstack/cert-manager v1.7.3/go.mod h1:xj0TPp31HE0Jub5mNOnF3Fp3XvhIsiP+tsPZVOmU/Qs= github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= +github.com/jhump/gopoet v0.0.0-20190322174617-17282ff210b3/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= +github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= +github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= github.com/jhump/protoreflect v1.6.0/go.mod h1:eaTn3RZAmMBcV0fifFvlm6VHNz3wSkYyXYWUh7ymB74= github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4= +github.com/jhump/protoreflect v1.11.0/go.mod h1:U7aMIjN0NWq9swDP7xDdoMfRHb35uiuTd3Z9nFXJf5E= +github.com/jhump/protoreflect v1.12.0/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8= github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= github.com/jinzhu/gorm v0.0.0-20170316141641-572d0a0ab1eb/go.mod h1:Vla75njaFJ8clLU1W44h34PjIkijhjHIYnZxMqCdxqo= github.com/jinzhu/inflection v0.0.0-20190603042836-f5c5f50e6090/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -2344,16 +3560,23 @@ github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9Y github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jmhodges/clock v0.0.0-20160418191101-880ee4c33548/go.mod h1:hGT6jSUVzF6no3QaDSMLGLEHtHSBSefs+MgcDWnmhmo= +github.com/jmhodges/clock v1.2.0/go.mod h1:qKjhA7x7u/lQpPB1XAqX1b1lCI/w3/fNuYpI/ZjLynI= github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= +github.com/jmoiron/sqlx v1.3.4/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ= github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= github.com/johannesboyne/gofakes3 v0.0.0-20210819161434-5c8dfcfe5310/go.mod h1:LIAXxPvcUXwOcTIj9LSNSUpE9/eMHalTWxsP/kmWxQI= +github.com/johannesboyne/gofakes3 v0.0.0-20221110173912-32fb85c5aed6/go.mod h1:LIAXxPvcUXwOcTIj9LSNSUpE9/eMHalTWxsP/kmWxQI= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/jonboulle/clockwork v0.3.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/josephspurrier/goversioninfo v1.4.0/go.mod h1:JWzv5rKQr+MmW+LvM412ToT/IkYDZjaclF2pKDss8IY= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/josharian/txtarfs v0.0.0-20210218200122-0702f000015a/go.mod h1:izVPOvVRsHiKkeGCT6tYBNWyDVuzj9wAaBb5R9qamfw= @@ -2372,7 +3595,6 @@ github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/ github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jsonnet-bundler/jsonnet-bundler v0.1.0/go.mod h1:YKsSFc9VFhhLITkJS3X2PrRqWG9u2Jq99udTdDjQLfM= github.com/jsonnet-bundler/jsonnet-bundler v0.2.0/go.mod h1:/by7P/OoohkI3q4CgSFqcoFsVY+IaNbzOVDknEsKDeU= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= @@ -2383,6 +3605,7 @@ github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSg github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/k8snetworkplumbingwg/network-attachment-definition-client v0.0.0-20191119172530-79f836b90111 h1:Lq6HJa0JqSg5ko/mkizFWlpIrY7845g9Dzz9qeD5aXI= @@ -2394,9 +3617,12 @@ github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0Lh github.com/karrick/godirwalk v1.10.12/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= github.com/karrick/godirwalk v1.16.1 h1:DynhcF+bztK8gooS0+NDJFrdNZjJ3gzVzC545UNA9iw= github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kelseyhightower/envconfig v1.3.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= +github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/keybase/go-crypto v0.0.0-20190403132359-d65b6b94177f/go.mod h1:ghbZscTyKdM07+Fw3KSi0hcJm+AlEUWj8QLlPtijN/M= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= @@ -2404,26 +3630,36 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI github.com/kisielk/errcheck v1.6.2/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkHAIKE/contextcheck v1.1.3/go.mod h1:PG/cwd6c0705/LM0KTr1acO2gORUxkSVWyLJOFW5qoo= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.13.0/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.7/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid v1.2.2/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/klauspost/pgzip v1.2.1/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/knative/build v0.1.2/go.mod h1:/sU74ZQkwlYA5FwYDJhYTy61i/Kn+5eWfln2jDbw3Qo= -github.com/knz/strtime v0.0.0-20181018220328-af2256ee352c/go.mod h1:4ZxfWkxwtc7dBeifERVVWRy9F9rTU9p0yCDgeCtlius= +github.com/kolo/xmlrpc v0.0.0-20201022064351-38db28db192b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= +github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= github.com/konsorten/go-windows-terminal-sequences v0.0.0-20180402223658-b729f2633dfe/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -2455,7 +3691,6 @@ github.com/kubernetes-csi/external-snapshotter/client/v4 v4.2.0/go.mod h1:YBCo4D github.com/kubernetes-csi/external-snapshotter/client/v6 v6.2.0 h1:cMM5AB37e9aRGjErygVT6EuBPB6s5a+l95OPERmSlVM= github.com/kubernetes-csi/external-snapshotter/client/v6 v6.2.0/go.mod h1:VQVLCPGDX5l6V5PezjlDXLa+SpCbWSVU7B16cFWVVeE= github.com/kubernetes-csi/external-snapshotter/v2 v2.0.1/go.mod h1:vUEcwbrEpsQ/rDgaO8WTe1gVIY/4CCj0S4Q+UuOq5wA= -github.com/kubernetes-csi/external-snapshotter/v2 v2.1.1/go.mod h1:dV5oB3U62KBdlf9ADWkMmjGd3USauqQtwIm2OZb5mqI= github.com/kubernetes-sigs/aws-ebs-csi-driver v0.9.0 h1:qkHSINGfFS5O8Qplw/WAdYUkmdQ5OPsC/2LpAuesfGY= github.com/kubernetes-sigs/aws-ebs-csi-driver v0.9.0/go.mod h1:9rv0ManDzr35FnHmuDQv+Vms73LGf6qyXlJhbOjqtZc= github.com/kulti/thelper v0.6.3/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= @@ -2467,7 +3702,9 @@ github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+ github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg= github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= +github.com/labstack/echo/v4 v4.7.2/go.mod h1:xkCDAdFCIf8jsFQ5NnbK7oqaF/yU1A1X20Ltm0OvSks= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/labstack/gommon v0.3.1/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw= github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= @@ -2476,10 +3713,22 @@ github.com/ldez/gomoddirectives v0.2.3/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdB github.com/ldez/tagliatelle v0.3.1/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88= github.com/leanovate/gopter v0.2.4/go.mod h1:gNcbPWNEWRe4lm+bycKqxUYoH5uoVje5SkOJ3uoLer8= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/leonklingele/grouper v1.1.0/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY= +github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= +github.com/lestrrat-go/blackmagic v1.0.0/go.mod h1:TNgH//0vYSs8VXDCfkZLgIrVTTXQELZffUV0tz3MtdQ= +github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= +github.com/lestrrat-go/iter v1.0.1/go.mod h1:zIdgO1mRKhn8l9vrZJZz9TUMMFbQbLeTsbqPDrJ/OJc= +github.com/lestrrat-go/jwx v1.2.25/go.mod h1:zoNuZymNl5lgdcu6P7K6ie2QRll5HVfF4xwxBBK1NxY= +github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= +github.com/letsencrypt/borp v0.0.0-20230707160741-6cc6ce580243/go.mod h1:podMDq5wDu2ZO6JMKYQcjD3QdqOfNLWtP2RDSy8CHUU= +github.com/letsencrypt/boulder v0.0.0-20221109233200-85aa52084eaf/go.mod h1:aGkAgvWY/IUcVFfuly53REpfv5edu25oij+qHRFaraA= +github.com/letsencrypt/boulder v0.0.0-20230907030200-6d76a0f91e1e/go.mod h1:EAuqr9VFWxBi9nD5jc/EA2MT1RFty9288TF6zdtYoCU= +github.com/letsencrypt/challtestsrv v1.2.1/go.mod h1:Ur4e4FvELUXLGhkMztHOsPIsvGxD/kzSJninOrkM+zc= github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag= +github.com/letsencrypt/validator/v10 v10.0.0-20230215210743-a0c7dfc17158/go.mod h1:ZFNBS3H6OEsprCRjscty6GCBe5ZiX44x6qY4s7+bDX0= github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -2490,11 +3739,11 @@ github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libopenstorage/autopilot-api v0.6.1-0.20210301232050-ca2633c6e114 h1:R40Co9ha2lE25x+/hycaf6dlhZLe+qxu1JprnR+5mdA= github.com/libopenstorage/autopilot-api v0.6.1-0.20210301232050-ca2633c6e114/go.mod h1:2RSNxzYtg9O7fCMZSuc9imAE4R8zhCi7azNbFkYLAuk= -github.com/libopenstorage/cloudops v0.0.0-20190815012442-6e0d676b6c3e/go.mod h1:quSDXGC3Fhc+pBwMRIi1Gk+kaSfBDZo5rRsftapTzGE= github.com/libopenstorage/cloudops v0.0.0-20200604165016-9cc0977d745e/go.mod h1:5Qie78eVLLXqLkLCq1+0HyJzjpdRCHyeg9LWlU0WPfU= github.com/libopenstorage/cloudops v0.0.0-20221107233229-3fa4664e96b1/go.mod h1:FkADW9gyVQyD6igV0keQ3nW9k+V3W88yhJ4faZP97wI= github.com/libopenstorage/cloudops v0.0.0-20230220114907-3e63dce1b413 h1:OOK0nxRDxGG4CkeiC0MCiFuKMsxiIGLS1WsLB4bZcLs= @@ -2505,26 +3754,21 @@ github.com/libopenstorage/gossip v0.0.0-20190507031959-c26073a01952/go.mod h1:Tj github.com/libopenstorage/gossip v0.0.0-20200808224301-d5287c7c8b24/go.mod h1:TjXt2Iz2bTkpfc4Q6xN0ttiNipTVwEEYoZSMZHlfPek= github.com/libopenstorage/gossip v0.0.0-20220309192431-44c895e0923e h1:4l9N2Sw8VGGUqe50yC2BnTFMRJuHJGpIGZcCUZ2S6gg= github.com/libopenstorage/gossip v0.0.0-20220309192431-44c895e0923e/go.mod h1:TjXt2Iz2bTkpfc4Q6xN0ttiNipTVwEEYoZSMZHlfPek= -github.com/libopenstorage/openstorage v1.0.1-0.20240221210452-7757fdc2b8ff h1:9uognDSvafpcrNICT8I5OJRt9TlLeV61cF6nIl9KwBQ= -github.com/libopenstorage/openstorage v1.0.1-0.20240221210452-7757fdc2b8ff/go.mod h1:8E8ueY3NJV+tcOr1BQBvyNU9FRtDfcRGB7+trr07+rA= +github.com/libopenstorage/openstorage v1.0.1-0.20240416193513-1e07b4359307 h1:baUZtqU5XFF26Weeb06vdZYrGlDpcqH1A7VmDqZHHTc= +github.com/libopenstorage/openstorage v1.0.1-0.20240416193513-1e07b4359307/go.mod h1:8E8ueY3NJV+tcOr1BQBvyNU9FRtDfcRGB7+trr07+rA= github.com/libopenstorage/openstorage-sdk-clients v0.109.0/go.mod h1:vo0c/nLG2HIyQva4Avwx61U1kWcw4HGQh3sjzV2DEEs= -github.com/libopenstorage/operator v0.0.0-20191009190641-8642de5d0812/go.mod h1:Qh+VXOB6hj60VmlgsmY+R1w+dFuHK246UueM4SAqZG0= -github.com/libopenstorage/operator v0.0.0-20200725001727-48d03e197117/go.mod h1:Qh+VXOB6hj60VmlgsmY+R1w+dFuHK246UueM4SAqZG0= -github.com/libopenstorage/operator v0.0.0-20210303221358-0bb211a9908c/go.mod h1:+83bY859mKGwHmWW8TPNYGrXAgt/hXOX2Ia7EytK17I= -github.com/libopenstorage/operator v0.0.0-20221128182303-7bedcffb60e6/go.mod h1:j+xZSt4DMXB8MDDd72MwpwGlWURIUaKOtoldq+DPHMk= -github.com/libopenstorage/operator v0.0.0-20230112002659-7e73437e61d4/go.mod h1:/sGycOMcavuKLWm3Vd907luRXZA/mcqFs1AdEbbT5k4= github.com/libopenstorage/operator v0.0.0-20230202214252-140e2e1fd86a/go.mod h1:Q66wsNUAekPawgGg9yh0Bs7eXWPa4/+c2JTefdiDciM= -github.com/libopenstorage/operator v0.0.0-20240417190906-af0509c9db88 h1:18WXQ6DEZp11xHNOG+ouxCvQpssbwrJR2BFfoTbBuWM= -github.com/libopenstorage/operator v0.0.0-20240417190906-af0509c9db88/go.mod h1:KsLOFm0UNYBSWB4YMy96763QKTM56t8WKQw3A4Xm7Nw= +github.com/libopenstorage/operator v0.0.0-20230323034810-8853b151f594/go.mod h1:0S4k1ouTScuVS3rxPukfEFvc5bMasmI1wpAAM0NejWQ= +github.com/libopenstorage/operator v0.0.0-20230801044606-e27dec4914d4/go.mod h1:Lc0sagIlgkrXHn+vwR9JfZkAkSsdedtbrRx42qF0vMc= +github.com/libopenstorage/operator v0.0.0-20240523172951-e085c3099bd7 h1:Qr7ifMS5HYAHP9KnWy3KaeRYrDBBnTXlTg16vkBse2E= +github.com/libopenstorage/operator v0.0.0-20240523172951-e085c3099bd7/go.mod h1:xrP2i+9TzxEl5tWRMsxfA5uEVe8AI4BjSisXhhSPLOQ= github.com/libopenstorage/secrets v0.0.0-20190403224602-c282e8dc17bf/go.mod h1:4QOUUeRMHtTniKPj+biL3wlusahU/7OnMsGKc4FN/EY= github.com/libopenstorage/secrets v0.0.0-20200207034622-cdb443738c67/go.mod h1:4QOUUeRMHtTniKPj+biL3wlusahU/7OnMsGKc4FN/EY= github.com/libopenstorage/secrets v0.0.0-20210908194121-a1d19aa9713a/go.mod h1:gE8rSd6lwLNXNbiW3DrRZjFMs+y4fDHy/6uiOO9cdzY= github.com/libopenstorage/secrets v0.0.0-20220413195519-57d1c446c5e9/go.mod h1:gE8rSd6lwLNXNbiW3DrRZjFMs+y4fDHy/6uiOO9cdzY= github.com/libopenstorage/secrets v0.0.0-20230207140542-56a42ef89592 h1:QSuOGFg29wTJPYew6QVDCJ/QeoskbkPGeWYwh9BYL3c= github.com/libopenstorage/secrets v0.0.0-20230207140542-56a42ef89592/go.mod h1:2+ZLEld0q0MqgpZwYyhl95YsNCmfKOBzvFyD26bxsdU= -github.com/libopenstorage/stork v0.0.0-20191009210244-6a3497c42b2a/go.mod h1:qBSzYTJVHlOMg5RINNiHD1kBzlasnrc2uKLPZLgu1Qs= github.com/libopenstorage/stork v1.3.0-beta1.0.20200630005842-9255e7a98775/go.mod h1:qBSzYTJVHlOMg5RINNiHD1kBzlasnrc2uKLPZLgu1Qs= -github.com/libopenstorage/stork v1.3.0-beta1.0.20210503014041-fb328e234db7/go.mod h1:Z38BxJx7Al1BVEX0RLa9BtqEzU3QQjwDu9FEspIuXck= github.com/libopenstorage/stork v1.4.1-0.20210903185636-5a1f8a4142bf/go.mod h1:Q2Rvi8M1Zpyd5BPE3HbmHkaKblzm0HxvWPJFW8Y4T7Y= github.com/libopenstorage/stork v1.4.1-0.20210923201245-97089f8df635/go.mod h1:MbN4lDn47O/Ryr81dWS1wb83K9FqeKMga+waSIc4J5I= github.com/libopenstorage/stork v1.4.1-0.20210925152742-aaa75e7c457f/go.mod h1:V9fTbUFPOO/Ap3rfwz4bQJTB8L8rya1YiIbAfFhSPLA= @@ -2535,22 +3779,27 @@ github.com/libopenstorage/stork v1.4.1-0.20211103064004-088d8fdeaa37/go.mod h1:I github.com/libopenstorage/stork v1.4.1-0.20211113171730-e02f28e240e9/go.mod h1:NTt7xK9DqWpXLEBJI4WEz/XTUG3EkW0zcqyOMO5Xp2w= github.com/libopenstorage/stork v1.4.1-0.20220323180113-0ea773109d05/go.mod h1:h+tscSChqPpry+lUHJYFqC+Gk0JY/qi6eCkUJYBo0wQ= github.com/libopenstorage/stork v1.4.1-0.20220414104250-3c18fd21ed95/go.mod h1:yE94X0xBFSBQ9LvvJ/zppc4+XeiCAXtsHfYHm15dlcA= -github.com/libopenstorage/stork v1.4.1-0.20220902043617-635e642468d0/go.mod h1:oQ0lteROzRCxHMvESCSyOiY/9oqgO3Qrvfs5LI/jVCA= -github.com/libopenstorage/stork v1.4.1-0.20220902111346-9dbf76d2db2c/go.mod h1:KNG/pkhMCdKXXFr0nKtYybWCx2ggLCoi+I7Onylwl64= github.com/libopenstorage/stork v1.4.1-0.20221103082056-65abc8cc4e80/go.mod h1:yX+IlCrUsZekC6zxL6zHE7sBPKIudubHB3EcImzeRbI= -github.com/libopenstorage/stork v1.4.1-0.20230206103328-883ffb861be8/go.mod h1:J6q5Z1db0jCMRVXCC/ptFF8HOcjicxTxpz45O2iPuIE= -github.com/libopenstorage/stork v1.4.1-0.20230207013129-a31284f0e973/go.mod h1:/EFTTQyBxNzul96urrYPdjNEYeDzVgZzK88gRQjoVmk= -github.com/libopenstorage/stork v1.4.1-0.20230207125320-e6ce79c590f6/go.mod h1:aSWCXcTPhmCDj9XxNL0+J6JQ7TmxXp4QTUVY9Wq8ejs= -github.com/libopenstorage/stork v1.4.1-0.20240417024347-acff28bbdb16 h1:XMPYSevauGNa3pnsZlrWR2wYbCPFS8DiQkU84bhN6Cg= -github.com/libopenstorage/stork v1.4.1-0.20240417024347-acff28bbdb16/go.mod h1:l4qH7zGZe0NXWSeIFIL1Y+6dQg2OIAfbQQq98TwlPZ0= +github.com/libopenstorage/stork v1.4.1-0.20230208122050-965b4be91e93/go.mod h1:T19yWS9FaiyM38aagBJ6rwHDB5EJB8TS8NdcP99CRwQ= +github.com/libopenstorage/stork v1.4.1-0.20230220135555-e7677b4945dd/go.mod h1:Yk122oBhH8yC5Pm7vmda5a3GI3wCxQpuonScZG4Ewew= +github.com/libopenstorage/stork v1.4.1-0.20230310131740-6799188e7fac/go.mod h1:sE83yimgTrJAJCKKF1Y9k+6T2d6uflx4FXdi6mVVUJg= +github.com/libopenstorage/stork v1.4.1-0.20230406052032-4da60c7d3a83/go.mod h1:7Cn5ZeJ82WoJSNDMnX1t//Amzd5M/8h7Icx7Pf3IhW0= +github.com/libopenstorage/stork v1.4.1-0.20230502135851-9cacb19e1df5/go.mod h1:RK6MPw0080h2ADDXDnJzQ+cKn1SEClTyoAW7sUAhi98= +github.com/libopenstorage/stork v1.4.1-0.20230519043154-cbc10dffaf19/go.mod h1:Xm4DHoViynFXMQKBXGj3IkA77LY2RBFkNtv6vbo3wNw= +github.com/libopenstorage/stork v1.4.1-0.20230601053837-5dd68f026569/go.mod h1:+mKPMCPNhS/XOF2RPcNFijkr67CCCWp0o8OXVG6xxAk= +github.com/libopenstorage/stork v1.4.1-0.20230610103146-72cf75320066/go.mod h1:Yst+fnOYjWk6SA5pXZBKm19wtiinjxQ/vgYTXI3k80Q= +github.com/libopenstorage/stork v1.4.1-0.20240424105137-8c6fa2a3f934 h1:MT5GvIDKwjrWmvwX29KjpHWpcX4eYFwrJNrGFS81wwU= +github.com/libopenstorage/stork v1.4.1-0.20240424105137-8c6fa2a3f934/go.mod h1:l4qH7zGZe0NXWSeIFIL1Y+6dQg2OIAfbQQq98TwlPZ0= github.com/libopenstorage/systemutils v0.0.0-20160208220149-44ac83be3ce1/go.mod h1:xwNGC7xiz/BQ/wbMkvHujL8Gjgseg+x41xMek7sKRRQ= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= -github.com/lightstep/lightstep-tracer-go v0.15.6/go.mod h1:6AMpwZpsyCFwSovxzM78e+AsYxE8sGwiM6C3TytaWeI= github.com/lightstep/lightstep-tracer-go v0.18.0/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= github.com/linode/linodego v0.7.1/go.mod h1:ga11n3ivecUrPCHN0rANxKmfWBJVkOXfLMZinAbj2sY= +github.com/linode/linodego v1.4.0/go.mod h1:PVsRxSlOiJyvG4/scTszpmZDTdgS+to3X6eS8pRrWI8= +github.com/linode/linodego v1.14.1/go.mod h1:NJlzvlNtdMRRkXb0oN6UWzUkj6t+IBsyveHgZ5Ppjyk= github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/lithammer/shortuuid v3.0.0+incompatible/go.mod h1:FR74pbAuElzOUuenUHTK2Tciko1/vKuIKS9dSkDrA4w= @@ -2558,14 +3807,19 @@ github.com/lovoo/gcloud-opentracing v0.3.0/go.mod h1:ZFqk2y38kMDDikZPAK7ynTTGuyt github.com/lpabon/godbc v0.1.1/go.mod h1:Jo9QV0cf3U6jZABgiJ2skINAXb9j8m51r07g4KI92ZA= github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/luna-duclos/instrumentedsql v1.1.3/go.mod h1:9J1njvFds+zN7y85EDhN9XNQLANWwZt2ULeIC8yMNYs= github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= +github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= +github.com/lyft/protoc-gen-star/v2 v2.0.3/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -2589,6 +3843,7 @@ github.com/martini-contrib/render v0.0.0-20150707142108-ec18f8345a11/go.mod h1:A github.com/maruel/panicparse v0.0.0-20171209025017-c0182c169410/go.mod h1:nty42YY5QByNC5MM7q/nj938VbgPU7avs45z6NClpxI= github.com/maruel/ut v1.0.0/go.mod h1:I68ffiAt5qre9obEVTy7S2/fj2dJku2NYLvzPuY0gqE= github.com/matoous/godox v0.0.0-20210227103229-6504466cf951/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= +github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= github.com/matryer/moq v0.0.0-20200607124540-4638a53893e6/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= @@ -2601,6 +3856,7 @@ github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= @@ -2621,6 +3877,7 @@ github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOA github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-oci8 v0.1.1/go.mod h1:wjDx6Xm9q7dFtHJvIlrI99JytznLw5wQ4R+9mNXJwGI= @@ -2640,8 +3897,12 @@ github.com/mattn/go-sqlite3 v0.0.0-20160514122348-38ee283dabf1/go.mod h1:FPy6Kqz github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.15 h1:vfoHhTN1af61xCRSWzFIWzx2YskyMTwHLrExkBOjvxI= +github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/mattn/go-sqlite3 v1.14.17 h1:mCRHCLDUBXgpKAqIKsaAaAsrAlbkeomtRFKXh2L6YIM= +github.com/mattn/go-sqlite3 v1.14.17/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mattn/go-zglob v0.0.1/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= github.com/matttproud/golang_protobuf_extensions v1.0.0/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= @@ -2658,14 +3919,20 @@ github.com/mholt/archiver v3.1.1+incompatible/go.mod h1:Dh2dOXnSdiLxRiPoVfIr/fI1 github.com/mholt/archiver/v3 v3.5.1/go.mod h1:e3dqJ7H78uzsRSEACH1joayhuSyhnonssnDhppzS1L4= github.com/michaelklishin/rabbit-hole v0.0.0-20191008194146-93d9988f0cd5/go.mod h1:+pmbihVqjC3GPdfWv1V2TnRSuVvwrWLKfEP/MZVB/Wc= github.com/michaelklishin/rabbit-hole/v2 v2.12.0/go.mod h1:AN/3zyz7d++OHf+4WUo/LR0+Q5nlPHMaXasIsG/mPY0= +github.com/microcosm-cc/bluemonday v1.0.16/go.mod h1:Z0r70sCuXHig8YpBzCc5eGHAap2K7e/u082ZUpDRRqM= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.8/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.15/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.17/go.mod h1:WgzbA6oji13JREwiNsRDNfl7jYdPnmz+VEuLrA+/48M= github.com/miekg/dns v1.1.22/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.25/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.29/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= +github.com/miekg/dns v1.1.48/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= +github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= +github.com/miekg/dns v1.1.51/go.mod h1:2Z9d3CP1LQWihRZUf29mQ19yDThaI4DAYzte2CaQW5c= github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo= github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= @@ -2673,11 +3940,15 @@ github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WT github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a/go.mod h1:v8eSC2SMp9/7FTKUncp7fH9IwPfw+ysMObcEz5FWheQ= github.com/mindprince/gonvml v0.0.0-20190828220739-9ebdce4bb989/go.mod h1:2eu9pRWp8mo84xCg6KswZ+USQHjwgRhNp06sozOdsTY= -github.com/minio/cli v1.20.0/go.mod h1:bYxnK0uS629N3Bq+AOZZ+6lwF77Sodk4+UL9vNuXhOY= -github.com/minio/minio-go/v6 v6.0.27-0.20190529152532-de69c0e465ed/go.mod h1:vaNT59cWULS37E+E9zkuN/BVnKHyXtVGS+b04Boc66Y= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= +github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/minio/minio-go/v6 v6.0.49/go.mod h1:qD0lajrGW49lKZLtXKtCB4X/qkMf0a5tBvN2PaZg7Gg= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= +github.com/mistifyio/go-zfs/v3 v3.0.1/go.mod h1:CzVgeB0RvF2EGzQnytKVvVSDwmKJXxkOTUGbNrTja/k= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/cli v1.1.2/go.mod h1:6iaV0fGdElS6dPBx0EApTxHrcWvmJphyh2n8YBLPPZ4= @@ -2685,7 +3956,6 @@ github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0 github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/go-homedir v0.0.0-20180523094522-3864e76763d9/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -2722,9 +3992,12 @@ github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mmcloughlin/avo v0.5.0/go.mod h1:ChHFdoV7ql95Wi7vuq2YT1bwCJqiWdZrQ1im3VujLYM= +github.com/mndrix/tap-go v0.0.0-20171203230836-629fa407e90b/go.mod h1:pzzDgJWZ34fGzaAZGFW22KVZDfyrYW+QABMrWnJBnSs= github.com/moby/ipvs v1.0.1/go.mod h1:2pngiyseZbIKXNv7hsKj3O9UEz30c53MT9005gt2hxQ= github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/patternmatcher v0.5.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/moby/sys/mount v0.2.0/go.mod h1:aAivFE2LB3W4bACsUXChRHQ0qKWsetY4Y9V7sxOougM= @@ -2735,19 +4008,21 @@ github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdx github.com/moby/sys/mountinfo v0.6.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= +github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= github.com/moby/sys/signal v0.6.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= +github.com/moby/sys/signal v0.7.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= +github.com/moby/term v0.0.0-20221128092401-c43b287e0e0f/go.mod h1:15ce4BGCFxt7I5NQKT+HV0yEDxmf6fSysfEDiVo3zFM= github.com/moby/term v0.0.0-20221205130635-1aeaba878587 h1:HfkjXDfhgVaN5rmueG8cL8KKeFNecRCXFhaJ2qZ5SKA= github.com/moby/term v0.0.0-20221205130635-1aeaba878587/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= @@ -2761,8 +4036,8 @@ github.com/mongodb/go-client-mongodb-atlas v0.1.2/go.mod h1:LS8O0YLkA+sbtOb3fZLF github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -github.com/montanaflynn/stats v0.0.0-20180911141734-db72e6cae808 h1:pmpDGKLw4n82EtrNiLqB+xSz/JQwFOaZuMALYUHwX5s= -github.com/montanaflynn/stats v0.0.0-20180911141734-db72e6cae808/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/montanaflynn/stats v0.7.0 h1:r3y12KyNxj/Sb/iOE46ws+3mS1+MZca1wlHQFPsY/JU= +github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= @@ -2770,10 +4045,11 @@ github.com/moul/http2curl v1.0.0 h1:dRMWoAtb+ePxMlLkrCbAqh4TlPHXvoGUSQ323/9Zahs= github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/mozilla/scribe v0.0.0-20180711195314-fb71baf557c1/go.mod h1:FIczTrinKo8VaLxe6PWTPEXRXDIHz2QAwiaBaP5/4a8= github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= -github.com/mozillazg/go-cos v0.12.0/go.mod h1:Zp6DvvXn0RUOXGJ2chmWt2bLEqRAnJnS3DnAZsJsoaE= github.com/mozillazg/go-cos v0.13.0/go.mod h1:Zp6DvvXn0RUOXGJ2chmWt2bLEqRAnJnS3DnAZsJsoaE= github.com/mozillazg/go-httpheader v0.2.1/go.mod h1:jJ8xECTlalr6ValeXYdOF8fFUISeBAdw6E61aqQma60= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/mreiferson/go-httpclient v0.0.0-20160630210159-31f0106b4474/go.mod h1:OQA4XLvDbMgS8P0CevmM4m9Q3Jq4phKUzcocxuGJ5m8= +github.com/mreiferson/go-httpclient v0.0.0-20201222173833-5e475fde3a4d/go.mod h1:OQA4XLvDbMgS8P0CevmM4m9Q3Jq4phKUzcocxuGJ5m8= github.com/mrunalp/fileutils v0.0.0-20200520151820-abd8a0e76976/go.mod h1:x8F1gnqOkIEiO4rqoeEEEqQbo7HjGMTvyoq3gej4iT0= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= @@ -2790,14 +4066,23 @@ github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4N github.com/natefinch/atomic v0.0.0-20150920032501-a62ce929ffcc/go.mod h1:1rLVY/DWf3U6vSZgH16S7pymfrhK2lcUlXjgGglw/lY= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/jwt v1.2.2/go.mod h1:/xX356yQA6LuXI9xWW7mZNpxgF2mBmGecH+Fj34sP5Q= +github.com/nats-io/jwt/v2 v2.0.3/go.mod h1:VRP+deawSXyhNjXmxPCHskrR6Mq50BqpEI5SEcNiGlY= github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats-server/v2 v2.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nats.go v1.12.1/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.2.0/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1tqEu/s= +github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms= github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/ncw/swift v1.0.52/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/nelsam/hel/v2 v2.3.2/go.mod h1:1ZTGfU2PFTOd5mx22i5O0Lc2GY933lQ2wb/ggy+rL3w= +github.com/nelsam/hel/v2 v2.3.3/go.mod h1:1ZTGfU2PFTOd5mx22i5O0Lc2GY933lQ2wb/ggy+rL3w= github.com/networkplumbing/go-nft v0.2.0/go.mod h1:HnnM+tYvlGAsMU7yoYwXEVLLiDW9gdMmb5HoGcwpuQs= github.com/nicolai86/scaleway-sdk v1.10.2-0.20180628010248-798f60e20bb2/go.mod h1:TLb2Sg7HQcgGdloNxkrmtgDNR9uVYF3lfdFIN4Ro6Sk= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= @@ -2811,7 +4096,6 @@ github.com/nwaples/rardecode v1.1.2/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWk github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/oklog v0.0.0-20170918173356-f857583a70c3/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= @@ -2827,7 +4111,6 @@ github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2f github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.2.1-0.20160409220416-2c2e9bb47b4e/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -2838,7 +4121,6 @@ github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+ github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= -github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg= github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= @@ -2853,6 +4135,7 @@ github.com/onsi/ginkgo/v2 v2.3.0/go.mod h1:Eew0uilEqZmIEZr8JrvYlvOM7Rr6xzTmMV8Ay github.com/onsi/ginkgo/v2 v2.4.0/go.mod h1:iHkDK1fKGcBoEHT5W7YBq4RFWaQulw+caOMkAt4OrFo= github.com/onsi/ginkgo/v2 v2.5.0/go.mod h1:Luc4sArBICYCS8THh8v3i3i5CuSZO+RaQRaJoeNwomw= github.com/onsi/ginkgo/v2 v2.6.0/go.mod h1:63DOGlLAH8+REH8jUGdL3YpCpu7JODesutUjdENfUAc= +github.com/onsi/ginkgo/v2 v2.6.1/go.mod h1:yjiuMwPokqY1XauOgju45q3sJt6VzQ/Fict1LFVcsAo= github.com/onsi/ginkgo/v2 v2.7.0/go.mod h1:yjiuMwPokqY1XauOgju45q3sJt6VzQ/Fict1LFVcsAo= github.com/onsi/ginkgo/v2 v2.8.1/go.mod h1:N1/NbDngAFcSLdyZ+/aYTYGSlq9qMCS/cNKGJjy+csc= github.com/onsi/ginkgo/v2 v2.9.0/go.mod h1:4xkjoL/tZv4SMWeww56BU5kAt19mVB47gTWxmrTcxyk= @@ -2865,7 +4148,6 @@ github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xl github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY= github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM= github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.2.0/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= @@ -2874,7 +4156,6 @@ github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48= github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= @@ -2889,6 +4170,7 @@ github.com/onsi/gomega v1.21.1/go.mod h1:iYAIXgPSaDHak0LCMA+AWBpIKBr8WZicMxnE8lu github.com/onsi/gomega v1.22.1/go.mod h1:x6n7VNe4hw0vkyYUM4mjIXx3JbLiPaBPNgB7PRQ1tuM= github.com/onsi/gomega v1.24.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg= github.com/onsi/gomega v1.24.1/go.mod h1:3AOiACssS3/MajrniINInwbfOOtfZvplPzuRSmvt1jM= +github.com/onsi/gomega v1.24.2/go.mod h1:gs3J10IS7Z7r7eXRoNJIrNqU4ToQukCJhFtKrWgHWnk= github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= github.com/onsi/gomega v1.27.1/go.mod h1:aHX5xOykVYzWOV4WqQy0sy8BQptgukenXpCXfadcIAw= github.com/onsi/gomega v1.27.3/go.mod h1:5vG284IBtfDAmDyrK+eGyZmUgUlmi+Wngqo557cZ6Gw= @@ -2901,6 +4183,7 @@ github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8P github.com/onsi/gomega v1.31.1 h1:KYppCUK+bUgAZwHOu7EXVBKyQA6ILvOESHkn/tgoqvo= github.com/onsi/gomega v1.31.1/go.mod h1:y40C95dwAD1Nz36SsEnxvfFe8FFfNxzI5eJ0EYGyAy0= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/open-policy-agent/opa v0.42.2/go.mod h1:MrmoTi/BsKWT58kXlVayBb+rYVeaMwuBm3nYAN3923s= github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= @@ -2912,6 +4195,9 @@ github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zM github.com/opencontainers/image-spec v1.0.2-0.20211117181255-693428a734f5/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.1.0-rc2/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= +github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= +github.com/opencontainers/image-spec v1.1.0-rc3/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= github.com/opencontainers/image-spec v1.1.0-rc5/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= @@ -2925,6 +4211,7 @@ github.com/opencontainers/runc v1.1.0/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6i github.com/opencontainers/runc v1.1.2/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= github.com/opencontainers/runc v1.1.3/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= github.com/opencontainers/runc v1.1.4/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= +github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= github.com/opencontainers/runc v1.1.6 h1:XbhB8IfG/EsnhNvZtNdLB0GBw92GYEFvKlhaJk9jUgA= github.com/opencontainers/runc v1.1.6/go.mod h1:CbUumNnWCuTGFukNXahoo/RFBZvDAgRh/smNYNOhA50= github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= @@ -2934,38 +4221,46 @@ github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/ github.com/opencontainers/runtime-spec v1.0.3-0.20200728170252-4d89ac9fbff6/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20220825212826-86290f6a00fb/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.1.0-rc.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= +github.com/opencontainers/runtime-tools v0.9.0/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= +github.com/opencontainers/runtime-tools v0.9.1-0.20221107090550-2e043c6bd626/go.mod h1:BRHJJd0E+cx42OybVYSgUvZmU0B8P9gZuRXlZUP7TKI= github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= +github.com/opencontainers/selinux v1.9.1/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/opencontainers/selinux v1.10.1/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= +github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec= github.com/openlyinc/pointy v1.1.2/go.mod h1:w2Sytx+0FVuMKn37xpXIAyBNhFNBIJGR/v2m7ik1WtM= -github.com/openshift/api v0.0.0-20190322043348-8741ff068a47/go.mod h1:dh9o4Fs58gpFXGSYfnVxGR9PnV53I8TW84pQaJDdGiY= github.com/openshift/api v0.0.0-20210105115604-44119421ec6b/go.mod h1:aqU5Cq+kqKKPbDMqxo9FojgDeSpNJI7iuskjXjtojDg= +github.com/openshift/api v0.0.0-20211217221424-8779abfbd571/go.mod h1:F/eU6jgr6Q2VhMu1mSpMmygxAELd7+BUxs3NHZ25jV4= +github.com/openshift/api v0.0.0-20230426193520-54a14470e5dc/go.mod h1:ctXNyWanKEjGj8sss1KjjHQ3ENKFm33FFnS5BKaIPh4= github.com/openshift/api v0.0.0-20230503133300-8bbcb7ca7183 h1:t/CahSnpqY46sQR01SoS+Jt0jtjgmhgE6lFmRnO4q70= github.com/openshift/api v0.0.0-20230503133300-8bbcb7ca7183/go.mod h1:4VWG+W22wrB4HfBL88P40DxLEpSOaiBVxUnfalfJo9k= github.com/openshift/build-machinery-go v0.0.0-20200917070002-f171684f77ab/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE= -github.com/openshift/client-go v0.0.0-20180830153425-431ec9a26e50/go.mod h1:6rzn+JTr7+WYS2E1TExP4gByoABxMznR6y2SnUIkmxk= +github.com/openshift/build-machinery-go v0.0.0-20211213093930-7e33a7eb4ce3/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE= github.com/openshift/client-go v0.0.0-20210112165513-ebc401615f47 h1:+TEY29DK0XhqB7HFC9OfV8qf3wffSyi7MWv3AP28DGQ= github.com/openshift/client-go v0.0.0-20210112165513-ebc401615f47/go.mod h1:u7NRAjtYVAKokiI9LouzTv4mhds8P4S1TwdVAfbjKSk= github.com/openshift/custom-resource-status v1.1.2 h1:C3DL44LEbvlbItfd8mT5jWrqPfHnSOQoQf/sypqA6A4= github.com/openshift/custom-resource-status v1.1.2/go.mod h1:DB/Mf2oTeiAmVVX1gN+NEqweonAPY0TKUwADizj8+ZA= github.com/openshift/prom-label-proxy v0.1.1-0.20191016113035-b8153a7f39f1/go.mod h1:p5MuxzsYP1JPsNGwtjtcgRHHlGziCJJfztff91nNixw= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= -github.com/opentracing-contrib/go-stdlib v0.0.0-20170113013457-1de4cc2120e7/go.mod h1:PLldrQSroqzH70Xl+1DQcGnefIbqsKR7UDaiux3zV+w= github.com/opentracing-contrib/go-stdlib v0.0.0-20190519235532-cf7a6c988dc9/go.mod h1:PLldrQSroqzH70Xl+1DQcGnefIbqsKR7UDaiux3zV+w= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= github.com/openzipkin/zipkin-go v0.1.3/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= +github.com/openzipkin/zipkin-go v0.3.0/go.mod h1:4c3sLeE8xjNqehmF5RpAFLPLJxXscc0R4l6Zg0P1tTQ= github.com/operator-framework/api v0.17.1/go.mod h1:kk8xJahHJR3bKqrA+A+1VIrhOTmyV76k+ARv+iV+u1Q= -github.com/operator-framework/operator-sdk v0.0.7/go.mod h1:iVyukRkam5JZa8AnjYf+/G3rk7JI1+M6GsU0sq0B9NA= github.com/oracle/oci-go-sdk v7.0.0+incompatible/go.mod h1:VQb79nF8Z2cwLkLS35ukwStZIg5F66tcBccjip/j888= github.com/oracle/oci-go-sdk v12.5.0+incompatible/go.mod h1:VQb79nF8Z2cwLkLS35ukwStZIg5F66tcBccjip/j888= github.com/oracle/oci-go-sdk v13.1.0+incompatible/go.mod h1:VQb79nF8Z2cwLkLS35ukwStZIg5F66tcBccjip/j888= @@ -2977,10 +4272,13 @@ github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnh github.com/ory/dockertest/v3 v3.8.0/go.mod h1:9zPATATlWQru+ynXP+DytBQrsXV7Tmlx7K86H6fQaDo= github.com/ory/dockertest/v3 v3.9.1/go.mod h1:42Ir9hmvaAPm0Mgibk6mBPi7SFvTXxEcnztDYOJ//uM= github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= +github.com/otiai10/copy v1.6.0/go.mod h1:XWfuS3CrI0R6IE0FbgHsEazaXO8G0LpMp9o8tos0x4E= github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= +github.com/otiai10/mint v1.3.2/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= +github.com/ovh/go-ovh v1.3.0/go.mod h1:AxitLZ5HBRPyUd+Zl60Ajaag+rNTdVXWIkzfrVuTXWA= github.com/oxtoacart/bpool v0.0.0-20150712133111-4e1c5567d7c2/go.mod h1:L3UMQOThbttwfYRNFOWLLVXMhk5Lkio4GGOtw5UrxS0= github.com/packethost/packngo v0.1.1-0.20180711074735-b9cb5096f54c/go.mod h1:otzZQXgoO96RTzDB/Hycg0qZcXZsWJGJRSXbmEIJ+4M= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= @@ -2988,10 +4286,12 @@ github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FI github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/patrickmn/go-cache v0.0.0-20180815053127-5633e0862627/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= +github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= github.com/pborman/uuid v0.0.0-20180906182336-adf5a7427709/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.3.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= @@ -3006,15 +4306,17 @@ github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaF github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= -github.com/peterbourgon/diskv v0.0.0-20180312054125-0646ccaebea1/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/peterbourgon/g2s v0.0.0-20170223122336-d4e7ad98afea/go.mod h1:1VcHEd3ro4QMoHfiNl/j7Jkln9+KQuorp0PItHMJYNg= -github.com/petermattis/goid v0.0.0-20170504144140-0ded85884ba5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= +github.com/peterh/liner v0.0.0-20170211195444-bf27d3ba8e1d/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 h1:Ii+DKncOVM8Cu1Hc+ETb5K+23HdAMvESYE3ZJ5b5cMI= github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4 v2.2.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= @@ -3023,7 +4325,9 @@ github.com/pierrec/lz4 v2.5.2+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4/v4 v4.1.2/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pires/go-proxyproto v0.6.1/go.mod h1:Odh9VFOZJCf9G8cLW5o435Xf1J95Jw9Gw5rnCjcwzAY= +github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= github.com/pkg/browser v0.0.0-20210706143420-7d21f8c997e2/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= @@ -3043,11 +4347,8 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/polyfloyd/go-errorlint v1.0.5/go.mod h1:APVvOesVSAnne5SClsPxPdfvZTVDojXh1/G3qb5wjGI= github.com/portworx/dcos-secrets v0.0.0-20180616013705-8e8ec3f66611/go.mod h1:4hklRW/4DQpLqkcXcjtNprbH2tz/sJaNtqinfPWl/LA= -github.com/portworx/kdmp v0.4.1-0.20210907103225-5bf7fe9467ec/go.mod h1:y3gC3scahxunrBOWT/FyVjPTworM8JLBeeGHTlA48KQ= -github.com/portworx/kdmp v0.4.1-0.20210912113917-9ab5ca03f9ea/go.mod h1:y3gC3scahxunrBOWT/FyVjPTworM8JLBeeGHTlA48KQ= github.com/portworx/kdmp v0.4.1-0.20210916140650-6d5c5ebbea75/go.mod h1:y3gC3scahxunrBOWT/FyVjPTworM8JLBeeGHTlA48KQ= github.com/portworx/kdmp v0.4.1-0.20210925150700-f53aaa2c7696/go.mod h1:2iVeU1OpDV959uu2EinEHyI+qto/2DBvXzNrkrq/kp8= -github.com/portworx/kdmp v0.4.1-0.20210929095959-dbee7f98b06f/go.mod h1:k9yJD2Kvv9dyEkSv4J82t4nAsHJkPaV6jN0wq28MSmI= github.com/portworx/kdmp v0.4.1-0.20211004132125-118c8be62b32/go.mod h1:XuR8mr500GAXdW/lW2ASeyney3f/SlfP4140YjAIeec= github.com/portworx/kdmp v0.4.1-0.20211007020540-ca77d6d2ade1/go.mod h1:bTzLxUEmYhrft5MWnDRekNeU3KDngbzosbnY88p5jwA= github.com/portworx/kdmp v0.4.1-0.20211020042040-649a87216a48/go.mod h1:ethpTE5btKfTpuuC0T3bQHTBCLymlUaBAa2pRoCJixM= @@ -3056,14 +4357,17 @@ github.com/portworx/kdmp v0.4.1-0.20211108115338-ba2bebf06ffb/go.mod h1:cbaFBCLF github.com/portworx/kdmp v0.4.1-0.20220309093511-f7b925b9e53e/go.mod h1:RAXbeaO/JmwQPRJCDdOoY/UsmGPY/awWsL4FbDOqAVk= github.com/portworx/kdmp v0.4.1-0.20220414053457-962507678379/go.mod h1:EAVroITfYd50a0vi/ScAILl6h5RYJteuO/pg1y3vNNw= github.com/portworx/kdmp v0.4.1-0.20220710173715-5d42efc7d149/go.mod h1:nb5AupP/63ByyqAYfZ+E32LDEnP0PjgH6w+yKXxWIgE= -github.com/portworx/kdmp v0.4.1-0.20220902105026-dc14791e1508/go.mod h1:sTO9LkPkExEVE6BqowIzkrQsyBtGdaC4Vh1AcKQ4xZA= -github.com/portworx/kdmp v0.4.1-0.20220905153748-e0bb69e59f38/go.mod h1:NI2UgLITtggRvvaRA7lE4+Np4htDp+06Jf1LWksKyGA= -github.com/portworx/kdmp v0.4.1-0.20221123171404-53a7660f5795/go.mod h1:v8uQbjGe6UFNyrZ+vFKgEu30wsaTc1qg0OYOKmVmUOE= github.com/portworx/kdmp v0.4.1-0.20230127055521-e23d6b003478/go.mod h1:v8uQbjGe6UFNyrZ+vFKgEu30wsaTc1qg0OYOKmVmUOE= -github.com/portworx/kdmp v0.4.1-0.20230206120825-078c75a441b6/go.mod h1:EXN0bAM+c4iK7Xxui/ZVVIGWepmsbGxrOgcoUDYwGLs= +github.com/portworx/kdmp v0.4.1-0.20230209151708-9d8c326aab11/go.mod h1:XObxg8AY79IAOLNIcGIBQWlg863XNjwFPGUJlSBrPOY= +github.com/portworx/kdmp v0.4.1-0.20230308031442-d6603d7d4dca/go.mod h1:RaHG55jtHPOBU/tP51/iAT0u6+u7zSA7K6f5sluKWZQ= +github.com/portworx/kdmp v0.4.1-0.20230320064430-aad8b8b5f8ea/go.mod h1:3PNTzDtuJawHpdFQPE5+YFgoNgvTNU9L3K8rPgq1FDE= +github.com/portworx/kdmp v0.4.1-0.20230426121717-92715d963a77/go.mod h1:c203QBWxpd5A5k+/QWXPvy0/XcVMhD4qvd7sZALZous= +github.com/portworx/kdmp v0.4.1-0.20230512150336-6cfeaacef991/go.mod h1:qwi3mjMZHRLCNCH4U08fCBsI9UCDJ1U/rH+v/rZmGR4= +github.com/portworx/kdmp v0.4.1-0.20230529155955-fcad20beaf76/go.mod h1:BlJ+7XNBMoQhmwdNZ6WBeTF1FcD5lH/UNYUL4kFU29E= +github.com/portworx/kdmp v0.4.1-0.20230608130529-7990f9150bed/go.mod h1:M9QuYoZL07Jdj8hy4XsDU1OYwu39zzTdX/axFpALVS0= +github.com/portworx/kdmp v0.4.1-0.20230830195819-704706dda5c7/go.mod h1:KFeJuczRm1Jw6AdejFLcXHB6yrjfKY/X1brfWDmXgr8= github.com/portworx/kvdb v0.0.0-20190105022415-cccaa09abfc9/go.mod h1:Q8YyrNDvPp3DVF96BDcQuaC7fAYUCuUX+l58S7OnD2M= github.com/portworx/kvdb v0.0.0-20191223203141-f42097b1fcd8/go.mod h1:Q8YyrNDvPp3DVF96BDcQuaC7fAYUCuUX+l58S7OnD2M= -github.com/portworx/kvdb v0.0.0-20200311180812-b2c72382d652/go.mod h1:Q8YyrNDvPp3DVF96BDcQuaC7fAYUCuUX+l58S7OnD2M= github.com/portworx/kvdb v0.0.0-20200723230726-2734b7f40194/go.mod h1:Q8YyrNDvPp3DVF96BDcQuaC7fAYUCuUX+l58S7OnD2M= github.com/portworx/kvdb v0.0.0-20200929023115-b312c7519467/go.mod h1:Q8YyrNDvPp3DVF96BDcQuaC7fAYUCuUX+l58S7OnD2M= github.com/portworx/kvdb v0.0.0-20230326003017-21a38cf82d4b h1:nP+m9tYQv2cWbN9wAwjlhJU9FZRs7GaYszhLJBLAg/I= @@ -3071,36 +4375,12 @@ github.com/portworx/kvdb v0.0.0-20230326003017-21a38cf82d4b/go.mod h1:Q8YyrNDvPp github.com/portworx/pds-api-go-client v0.0.0-20231102112445-993d38984eae h1:/aJSqtgpIPa9os7yOoXQzvqYdRdMoS8X+TaKC/KRPY8= github.com/portworx/pds-api-go-client v0.0.0-20231102112445-993d38984eae/go.mod h1:yn0abd9g4Q3fBpY720Eb+hwRV1OnTjROUaSb9mOlzBk= github.com/portworx/px-backup-api v1.0.1-0.20200915150042-274508e876ef/go.mod h1:puy7YVXeb6glot1vVCIePIiRLSwB//+rFtN2ZjvXeEw= -github.com/portworx/px-backup-api v1.2.2-0.20240229114136-e58baeb9fbe1 h1:bbvoT2bRppI3ZjFDGb6zSumAxWiNxo0lpd5FzTiFD2U= -github.com/portworx/px-backup-api v1.2.2-0.20240229114136-e58baeb9fbe1/go.mod h1:G1pn/FceOq8W6DKaYuV8LJuKowzp4/Hdgliojl9akIU= +github.com/portworx/px-backup-api v1.2.2-0.20240513165102-9eda9e2fc169 h1:j+6fsZnHf50b0ZaGzYptcpnUl4lL8vGJcZWBVvSZqBM= +github.com/portworx/px-backup-api v1.2.2-0.20240513165102-9eda9e2fc169/go.mod h1:G1pn/FceOq8W6DKaYuV8LJuKowzp4/Hdgliojl9akIU= github.com/portworx/px-object-controller v0.0.0-20220804234424-40d3b8a84987/go.mod h1:g3pw2lI2AjqAixUCRhaBdKTY98znsCPR7NGRrlpimVU= github.com/portworx/pxc v0.33.0/go.mod h1:Tl7hf4K2CDr0XtxzM08sr9H/KsMhscjf9ydb+MnT0U4= -github.com/portworx/sched-ops v0.0.0-20200123020607-b0799c4686f5/go.mod h1:yb1ypNIiZQAmM7xAWGzO6dydwl/+vNC0WjUm5IvHUEY= -github.com/portworx/sched-ops v0.0.0-20200831185134-3e8010dc7056/go.mod h1:zb7WCZn/QEed/9tO3qA5+e28gMXPs07N9Sb5B1DSeAk= -github.com/portworx/sched-ops v0.0.0-20210301232128-6cd5f08740bf/go.mod h1:nl2AP/W8sWmhmW7ScwNQrm5OCHiHjLYQ2NmO3TUjIhE= -github.com/portworx/sched-ops v0.20.4-openstorage-rc3.0.20210325150944-0b2c202335f7/go.mod h1:DpRDDqXWQrReFJ5SHWWrURuZdzVKjrh2OxbAfwnrAyk= -github.com/portworx/sched-ops v1.20.0-rc1/go.mod h1:nl2AP/W8sWmhmW7ScwNQrm5OCHiHjLYQ2NmO3TUjIhE= -github.com/portworx/sched-ops v1.20.4-rc1/go.mod h1:orn0fDAHDqbKypAsSgbmJ8QmGMd3v1jTxdIRT9YIoEU= -github.com/portworx/sched-ops v1.20.4-rc1.0.20210805192436-d51186f75dc4/go.mod h1:+R+28pHhZ2Go7LquCo1+9ctpxwFGWak7zNcTFyXVh4k= -github.com/portworx/sched-ops v1.20.4-rc1.0.20210908045330-9060cf5304f1/go.mod h1:HvhqkdNhqynl9HyIfadsegoSjGpVpAwTMLync/sIXvA= -github.com/portworx/sched-ops v1.20.4-rc1.0.20210921050234-561b707a5d96/go.mod h1:y0JUD76QnRTNWv4tE2z9jpRxIWNB4RcP3S2g7UpAEOk= -github.com/portworx/sched-ops v1.20.4-rc1.0.20210929114621-9001768f8eb7/go.mod h1:5xy8TTt9m/8UGG8Hw5NHxwc/mctjCsmj7mpcR7jIFjI= -github.com/portworx/sched-ops v1.20.4-rc1.0.20211006132704-8a90df7acb50/go.mod h1:5xy8TTt9m/8UGG8Hw5NHxwc/mctjCsmj7mpcR7jIFjI= -github.com/portworx/sched-ops v1.20.4-rc1.0.20211026113317-db80e47fe929/go.mod h1:5xy8TTt9m/8UGG8Hw5NHxwc/mctjCsmj7mpcR7jIFjI= -github.com/portworx/sched-ops v1.20.4-rc1.0.20211116074603-2b6905763b23/go.mod h1:5xy8TTt9m/8UGG8Hw5NHxwc/mctjCsmj7mpcR7jIFjI= -github.com/portworx/sched-ops v1.20.4-rc1.0.20211217234328-ead591c0f22d/go.mod h1:5xy8TTt9m/8UGG8Hw5NHxwc/mctjCsmj7mpcR7jIFjI= -github.com/portworx/sched-ops v1.20.4-rc1.0.20220321032155-bcc98224224c/go.mod h1:5E/BwC3d4ysXce1fzNFjR2OU8rz7Kx6mt8T10HEiA0E= -github.com/portworx/sched-ops v1.20.4-rc1.0.20220327212454-cc1a88ecb579/go.mod h1:0IQvado0rnmbRMORaCqCDrrzjBrX5sU+Sz2+vQwEsjM= -github.com/portworx/sched-ops v1.20.4-rc1.0.20220401024625-dbc61a336f65/go.mod h1:0IQvado0rnmbRMORaCqCDrrzjBrX5sU+Sz2+vQwEsjM= -github.com/portworx/sched-ops v1.20.4-rc1.0.20220927173018-c9d3edcaef50/go.mod h1:LnhSWHaCvwWrmgqgNPFTrm4YModpyDcl9k8RqSC/8Co= -github.com/portworx/sched-ops v1.20.4-rc1.0.20221102055014-b3a55a3df5c8/go.mod h1:8XBwmcbDuhW0TWFKCaHH4oS5xsfGFU5miSyqb0fvl3U= -github.com/portworx/sched-ops v1.20.4-rc1.0.20221208153443-c95ed6d757fa/go.mod h1:wQK24M7cbrhAk378J2WwR0nMx86W/iJwRc1JilEmP40= -github.com/portworx/sched-ops v1.20.4-rc1.0.20230103234348-243afb3bb8aa/go.mod h1:wQK24M7cbrhAk378J2WwR0nMx86W/iJwRc1JilEmP40= -github.com/portworx/sched-ops v1.20.4-rc1.0.20230207070155-2e0ef25efadd/go.mod h1:JbHASXqA/GXwFD4blS1DZkrxtS5llb98ViZgUerOtQA= -github.com/portworx/sched-ops v1.20.4-rc1.0.20230207140221-24ec094deec4/go.mod h1:drIYh+6f/vh11dVmbpwFv3GIusQCSMThPX774U8ix7w= -github.com/portworx/sched-ops v1.20.4-rc1.0.20240411193047-d17313c6c11b h1:i9MQ68H2YvpNzlU625qQFuGqQBBqFUVqVoV1ggOqK8M= -github.com/portworx/sched-ops v1.20.4-rc1.0.20240411193047-d17313c6c11b/go.mod h1:LZkYF7Ke6gh3urQXFie1yBntpq1bINLVz05F8x314go= -github.com/portworx/talisman v0.0.0-20191007232806-837747f38224/go.mod h1:OjpMH9Uh5o9ntVGktm4FbjLNwubJ3ITih2OfYrAeWtA= +github.com/portworx/sched-ops v1.20.4-rc1.0.20240514213912-ff0ae32b859a h1:a1W4ako6JYsvrnnUIdQrCgcvOB8TjnNNIPlITYUMwXE= +github.com/portworx/sched-ops v1.20.4-rc1.0.20240514213912-ff0ae32b859a/go.mod h1:KOe618gr1FAzVmLNe9LFHss19df3MBZ0qom6Ct7RpyM= github.com/portworx/talisman v0.0.0-20210302012732-8af4564777f7/go.mod h1:e8a6uFpSbOlRpZQlW9aXYogC+GWAo065G0RL9hDkD4Q= github.com/portworx/talisman v1.1.3 h1:XrDE0fs4UACgDGi5bvt04uePC+QbhbA5YXozGYg5tr8= github.com/portworx/talisman v1.1.3/go.mod h1:e8a6uFpSbOlRpZQlW9aXYogC+GWAo065G0RL9hDkD4Q= @@ -3110,12 +4390,17 @@ github.com/posener/complete v1.2.1/go.mod h1:6gapUrK/U1TAN7ciCoNRIdVC5sbdBTUh1DK github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/poy/onpar v0.0.0-20190519213022-ee068f8ea4d1/go.mod h1:nSbFQvMj97ZyhFRSJYtut+msi4sOY6zJDGCdSc+/rZU= +github.com/poy/onpar v0.0.0-20200406201722-06f95a1c68e8/go.mod h1:nSbFQvMj97ZyhFRSJYtut+msi4sOY6zJDGCdSc+/rZU= +github.com/poy/onpar v0.3.1/go.mod h1:WJueGwprgKVeX1mfOJfCxEJNbyhYiY0lWw2i18UaEi0= +github.com/poy/onpar v0.3.2/go.mod h1:6XDWG8DJ1HsFX6/Btn0pHl3Jz5d1SEEGNZ5N1gtYo+I= github.com/poy/onpar v1.1.2 h1:QaNrNiZx0+Nar5dLgTVp5mXkyoVFIbepjyEoGSnhbAY= github.com/poy/onpar v1.1.2/go.mod h1:6X8FLNoxyr9kkmnlqpK6LSoiOtrO6MICtWwEuWkLjzg= +github.com/poy/onpar/v3 v3.0.0-20230319125606-a35e84953e8f/go.mod h1:nJ2Lyw+ezwTJHxo7CRPqV2o/3aA3fX6fQHsDNLT934g= github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8cTqKc= github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI= github.com/pquerna/otp v1.2.1-0.20191009055518-468c2dd2b58d/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg= +github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.44.1/go.mod h1:3WYi4xqXxGGXWDdQIITnLNmuDzO5n6wYva9spVhR4fg= github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.46.0/go.mod h1:3WYi4xqXxGGXWDdQIITnLNmuDzO5n6wYva9spVhR4fg= github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.63.0 h1:efsW3CfymG5bZUpeIsYfdihB33YItCn7uHBOEbnHQG8= @@ -3124,6 +4409,8 @@ github.com/prometheus-operator/prometheus-operator/pkg/client v0.46.0 h1:J5gQysJ github.com/prometheus-operator/prometheus-operator/pkg/client v0.46.0/go.mod h1:k4BrWlVQQsvBiTcDnKEMgyh/euRxyxgrHdur/ZX/sdA= github.com/prometheus/alertmanager v0.18.0/go.mod h1:WcxHBl40VSPuOaqWae6l6HpnEOVRIycEJ7i9iYkadEE= github.com/prometheus/alertmanager v0.20.0/go.mod h1:9g2i48FAyZW6BtbsnvHtMHQXl2aVtrORKwKVCQ+nbrg= +github.com/prometheus/alertmanager v0.24.0/go.mod h1:r6fy/D7FRuZh5YbnX6J3MBY0eI4Pb5yPYS7/bPSXXqI= +github.com/prometheus/alertmanager v0.25.0/go.mod h1:MEZ3rFVHqKZsw7IcNS/m4AWZeXThmJhumpiWR4eHU/w= github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -3144,9 +4431,11 @@ github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqr github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI= github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= +github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= +github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= github.com/prometheus/client_model v0.0.0-20170216185247-6f3806018612/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -3156,8 +4445,9 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 h1:v7DLqVdK4VrYkVD5diGdl4sxJurKJEMnODWRJlxV9oM= +github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20180518154759-7600349dcfe1/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= @@ -3165,7 +4455,6 @@ github.com/prometheus/common v0.0.0-20181020173914-7e9e6cabbd39/go.mod h1:daVV7q github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.3.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= @@ -3175,11 +4464,22 @@ github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB8 github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.34.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= +github.com/prometheus/common v0.38.0/go.mod h1:MBXfmBQZrK5XpbCkjofnXs96LD2QQ7fEq4C0xjC/yec= +github.com/prometheus/common v0.41.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= +github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= +github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= +github.com/prometheus/common/assets v0.1.0/go.mod h1:D17UVUE12bHbim7HzwUvtqm6gwBEaDQ0F+hIGbFbccI= +github.com/prometheus/common/assets v0.2.0/go.mod h1:D17UVUE12bHbim7HzwUvtqm6gwBEaDQ0F+hIGbFbccI= +github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= +github.com/prometheus/exporter-toolkit v0.7.1/go.mod h1:ZUBIj498ePooX9t/2xtDjeQYwvRpiPP2lh5u4iblj2g= +github.com/prometheus/exporter-toolkit v0.8.2/go.mod h1:00shzmJL7KxcsabLWcONwpyNEuWhREOnFqZW7vadFS0= +github.com/prometheus/exporter-toolkit v0.9.1/go.mod h1:iFlTmFISCix0vyuyBmm0UqOUCTao9+RsAsKJP3YM9ec= github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20180612222113-7d6f385de8be/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -3199,22 +4499,25 @@ github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= +github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI= +github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= github.com/prometheus/prometheus v0.0.0-20180315085919-58e2a31db8de/go.mod h1:oAIUtOny2rjMX0OWN5vPR5/q/twIROJvdqnQKDdil/s= +github.com/prometheus/prometheus v0.35.0/go.mod h1:7HaLx5kEPKJ0GDgbODG0fZgXbQ8K/XjZNJXQmbmgQlY= +github.com/prometheus/prometheus v0.43.1/go.mod h1:2BA14LgBeqlPuzObSEbh+Y+JwLH2GcqDlJKbF2sA6FM= github.com/prometheus/prometheus v1.8.2-0.20200110114423-1e64d757f711/go.mod h1:7U90zPoLkWjEIQcy/rweQla82OCTUzxVHE51G3OhJbI= github.com/prometheus/prometheus v2.3.2+incompatible/go.mod h1:oAIUtOny2rjMX0OWN5vPR5/q/twIROJvdqnQKDdil/s= -github.com/prometheus/prometheus v2.9.2+incompatible/go.mod h1:vdLuLLM0uqhLSofrQ7Nev2b/rQUyZ+pkT3zF7LB/i1g= github.com/prometheus/statsd_exporter v0.21.0 h1:hA05Q5RFeIjgwKIYEdFd59xu5Wwaznf33yKI+pyX6T8= github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/prometheus/tsdb v0.8.0/go.mod h1:fSI0j+IUQrDd7+ZtR9WKIGtoYAYAJUKcKhYLG25tN4g= +github.com/proullon/ramsql v0.0.0-20211120092837-c8d0a408b939/go.mod h1:jG8oAQG0ZPHPyxg5QlMERS31airDC+ZuqiAe8DUvFVo= github.com/pseudomuto/protoc-gen-doc v1.3.2/go.mod h1:y5+P6n3iGrbKG+9O04V5ld71in3v/bX88wUwgt+U8EA= +github.com/pseudomuto/protoc-gen-doc v1.5.1/go.mod h1:XpMKYg6zkcpgfpCfQ8GcWBDRtRxOmMR5w7pz4Xo+dYM= github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= -github.com/pure-px/apis v0.0.0-20240326194748-e9f7f27de779 h1:4v0l3HWdp/odrm4yYFpN9FBeaXnJwjYTmvdDA2FAhaQ= -github.com/pure-px/apis v0.0.0-20240326194748-e9f7f27de779/go.mod h1:vuPbG0guw0Nl8/a4Dpb9LSHKMPtf5dGR7SQqnpMjU4o= -github.com/pure-px/platform-api-go-client v0.0.0-20240422094205-23129136cfd2 h1:DEwD9GEXIS2ygsj+pBYv8CiZldWOsu0jJfN1z1797cg= -github.com/pure-px/platform-api-go-client v0.0.0-20240422094205-23129136cfd2/go.mod h1:1JYlDoZQvC6Q2T9LdXVWHCzBGgR9frA9JKTEz3aSQcQ= +github.com/pure-px/apis v0.0.3 h1:maDtswen6wrwe+D87n8KN5ATLxIdbkSd83KeE+OcM+g= +github.com/pure-px/apis v0.0.3/go.mod h1:vuPbG0guw0Nl8/a4Dpb9LSHKMPtf5dGR7SQqnpMjU4o= +github.com/pure-px/platform-api-go-client v0.0.0-20240529124619-a3e5f98d62f0 h1:Bv8FpQXTd5O4eYLO62lElCUcdRFchQK0xhIHs55LWpQ= +github.com/pure-px/platform-api-go-client v0.0.0-20240529124619-a3e5f98d62f0/go.mod h1:1JYlDoZQvC6Q2T9LdXVWHCzBGgR9frA9JKTEz3aSQcQ= github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30= github.com/quasilyte/go-ruleguard v0.3.18/go.mod h1:lOIzcYlgxrQ2sGJ735EHXmf/e9MJ516j16K/Ifcttvs= github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= @@ -3224,8 +4527,11 @@ github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mo github.com/quasilyte/gogrep v0.0.0-20220828223005-86e4605de09f/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng= github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= +github.com/rabbitmq/amqp091-go v1.1.0/go.mod h1:ogQDLSOACsLPsIq0NpbtiifNZi2YOz0VTJ0kHRghqbM= +github.com/rakyll/embedmd v0.0.0-20171029212350-c8060a0752a2/go.mod h1:7jOTMgqac46PZcF54q6l2hkLEG8op93fZu61KmxWDV4= github.com/rancher/apiserver v0.0.0-20221205175736-7c507bd5c076/go.mod h1:xwQhXv3XFxWfA6tLa4ZeaERu8ldNbyKv2sF+mT+c5WA= github.com/rancher/lasso v0.0.0-20221202205459-e7138f16489c/go.mod h1:Qewwr/xGzhtG7WCxhubrKZrdAobv5yqAIuHbDoxThZQ= +github.com/rancher/lasso v0.0.0-20221227210133-6ea88ca2fbcc/go.mod h1:dEfC9eFQigj95lv/JQ8K5e7+qQCacWs1aIA6nLxKzT8= github.com/rancher/norman v0.0.0-20221205184727-32ef2e185b99/go.mod h1:zpv7z4ySYL5LlEBKEPf/xf3cjx837/J2i/wHpT43viE= github.com/rancher/norman v0.0.0-20230110004459-34230bb2787c/go.mod h1:zpv7z4ySYL5LlEBKEPf/xf3cjx837/J2i/wHpT43viE= github.com/rancher/norman v0.0.0-20230222213531-275a3e921940 h1:fwAzRl0oF0kdHS1YWqCl/Xk59rjbXNpZcWMfknqeeH8= @@ -3237,15 +4543,20 @@ github.com/rancher/wrangler v1.1.0 h1:1VWistON261oKmCPF5fOPMWb/YwjgEciO9pCw5Z0mz github.com/rancher/wrangler v1.1.0/go.mod h1:lQorqAAIMkNWteece1GiuwZTmMqkaVTXL5qjiiPVDxQ= github.com/rboyer/safeio v0.2.1/go.mod h1:Cq/cEPK+YXFn622lsQ0K4KsPZSPtaptHHEldsy7Fmig= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/redis/go-redis/v9 v9.1.0/go.mod h1:urWj3He21Dj5k4TK1y59xH8Uj6ATueP8AH1cY3lZl4c= github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/go-dbus v0.0.0-20121104212943-b7232d34b1d5/go.mod h1:+u151txRmLpwxBmpYn9z3d1sdJdjRPQpsXuYeY9jNls= github.com/remyoudompheng/go-liblzma v0.0.0-20190506200333-81bf2d431b96/go.mod h1:90HvCY7+oHHUKkbeMCiHt1WuFR2/hPJ9QrljDG+v6ls= github.com/remyoudompheng/go-misc v0.0.0-20190427085024-2d6ac652a50e/go.mod h1:80FQABjoFzZ2M5uEa6FUaJYEmqU2UOKojlFVak1UAwI= github.com/renier/xmlrpc v0.0.0-20170708154548-ce4a1a486c03/go.mod h1:gRAiPF5C5Nd0eyyRdqIu9qTiFSoZzpTq727b5B8fkkU= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rlmcpherson/s3gof3r v0.5.0/go.mod h1:s7vv7SMDPInkitQMuZzH615G7yWHdrU2r/Go7Bo71Rs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= +github.com/rogpeppe/clock v0.0.0-20190514195947-2896927a307a/go.mod h1:4r5QyqhjIWCcK8DO4KMclc5Iknq5qVBAlbYYzAbUScQ= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc= @@ -3258,11 +4569,14 @@ github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTE github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.6.1-0.20190116175910-76f58f330d76/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/cors v1.9.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.4.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= @@ -3270,12 +4584,13 @@ github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThC github.com/rubenv/sql-migrate v1.1.2 h1:9M6oj4e//owVVHYrFISmY9LBRw6gzkCNmD9MV36tZeQ= github.com/rubenv/sql-migrate v1.1.2/go.mod h1:/7TZymwxN8VWumcIxw1jjHEcR1djpdkMHQPT4FWdnbQ= github.com/rubiojr/go-vhd v0.0.0-20200706105327-02e210299021/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= -github.com/rubyist/circuitbreaker v2.2.1+incompatible/go.mod h1:Ycs3JgJADPuzJDwffe12k6BZT8hxVi6lFK+gWYJLN4A= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/ryancurrah/gomodguard v1.2.4/go.mod h1:+Kem4VjWwvFpUJRJSwa16s1tBJe+vbv02+naTow2f6M= github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -3285,15 +4600,14 @@ github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIH github.com/ryszard/goskiplist v0.0.0-20150312221310-2dfbae5fcf46/go.mod h1:uAQ5PCi+MFsC7HjREoAz1BU+Mq60+05gifQSsHSDG/8= github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= +github.com/safchain/ethtool v0.2.0/go.mod h1:WkKB1DnNtvsMlDmQ50sgwowDJV/hGbJSOvJoEXs1AJQ= github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= -github.com/samuel/go-zookeeper v0.0.0-20161028232340-1d7be4effb13/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/samuel/go-zookeeper v0.0.0-20180130194729-c4fab1ac1bec/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/samuel/go-zookeeper v0.0.0-20190810000440-0ceca61e4d75/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sanposhiho/wastedassign/v2 v2.0.6/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= github.com/santhosh-tekuri/jsonschema v1.2.4/go.mod h1:TEAUOeZSmIxTTuHatJzrvARHiuO9LYd+cIxzgEHCQI4= -github.com/sasha-s/go-deadlock v0.0.0-20161201235124-341000892f3d/go.mod h1:StQn567HiB1fF2yJ44N9au7wOhrPS3iZqiDbRupzT10= github.com/sasha-s/go-deadlock v0.2.0/go.mod h1:StQn567HiB1fF2yJ44N9au7wOhrPS3iZqiDbRupzT10= github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= github.com/sashamelentyev/usestdlibvars v1.20.0/go.mod h1:0GaP+ecfZMXShS0A94CJn6aEuPRILv8h/VuWI9n1ygg= @@ -3301,6 +4615,8 @@ github.com/satori/go.uuid v0.0.0-20160603004225-b111a074d5ef/go.mod h1:dA0hQrYB0 github.com/satori/go.uuid v0.0.0-20160713180306-0aa62d5ddceb/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.9/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.14/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= github.com/sean-/conswriter v0.0.0-20180208195008-f5ae3917a627/go.mod h1:7zjs06qF79/FKAJpBvFx3P8Ww4UTIMAe+lpNXDHziac= @@ -3309,13 +4625,19 @@ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= +github.com/secure-systems-lab/go-securesystemslib v0.4.0/go.mod h1:FGBZgq2tXWICsxWQW1msNf49F0Pf2Op5Htayx335Qbs= +github.com/secure-systems-lab/go-securesystemslib v0.6.0/go.mod h1:8Mtpo9JKks/qhPG4HGZ2LGMvrPbzuxwfz/f/zLfEWkk= +github.com/secure-systems-lab/go-securesystemslib v0.7.0/go.mod h1:/2gYnlnHVQ6xeGtfIqFy7Do03K4cdCY0A/GlJLDKLHI= +github.com/secure-systems-lab/go-securesystemslib v0.8.0/go.mod h1:UH2VZVuJfCYR8WgMlCU1uFsOUU+KeyrTWcSS73NBOzU= github.com/securego/gosec/v2 v2.13.1/go.mod h1:EO1sImBMBWFjOTFzMWfTRrZW6M15gm60ljzrmy/wtHo= +github.com/segmentio/ksuid v1.0.4/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE= github.com/sendgrid/rest v2.6.0+incompatible/go.mod h1:kXX7q3jZtJXK5c5qK83bSGMdV6tsOE70KbHoqJls4lE= github.com/sendgrid/sendgrid-go v3.6.0+incompatible/go.mod h1:QRQt+LX/NmgVEvmdRw0VT/QgUn499+iza2FnDca9fg8= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= +github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= github.com/sethvargo/go-limiter v0.7.1/go.mod h1:C0kbSFbiriE5k2FFOe18M1YZbAR2Fiwf72uGu0CXCcU= github.com/shabbyrobe/gocovmerge v0.0.0-20180507124511-f6ea450bfb63/go.mod h1:n+VKSARF5y/tS9XFSP7vWDfS+GUC5vs/YT7M5XDTUEM= github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= @@ -3323,21 +4645,30 @@ github.com/shirou/gopsutil v2.19.9+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu github.com/shirou/gopsutil/v3 v3.22.6/go.mod h1:EdIubSnZhbAvBS1yJ7Xi+AShB/hxwLHOMz4MCYz7yMs= github.com/shirou/gopsutil/v3 v3.22.9/go.mod h1:bBYl1kjgEJpWpxeHmLI+dVHWtyAwfcmSBLDsp2TNT8A= github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= +github.com/shoenig/test v0.6.2/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= github.com/shoenig/test v1.7.0 h1:eWcHtTXa6QLnBvm0jgEabMRN/uJ4DMV3M8xUGgRkZmk= github.com/shoenig/test v1.7.0/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/githubv4 v0.0.0-20180925043049-51d7b505e2e9/go.mod h1:hAF0iLZy4td2EX+/8Tw+4nodhlMrwN3HupfaXj3zkGo= +github.com/shurcooL/githubv4 v0.0.0-20190718010115-4ba037080260/go.mod h1:hAF0iLZy4td2EX+/8Tw+4nodhlMrwN3HupfaXj3zkGo= github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= github.com/shurcooL/graphql v0.0.0-20180924043259-e4a3a37e6d42/go.mod h1:AuYgA5Kyo4c7HfUmvRGs/6rGlMMV/6B1bVnB9JxJEEg= +github.com/shurcooL/graphql v0.0.0-20181231061246-d48a9a75455f/go.mod h1:AuYgA5Kyo4c7HfUmvRGs/6rGlMMV/6B1bVnB9JxJEEg= github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/shurcooL/vfsgen v0.0.0-20180711163814-62bca832be04/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= github.com/shurcooL/vfsgen v0.0.0-20180825020608-02ddb050ef6b/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= +github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= +github.com/sigstore/sigstore v1.6.4/go.mod h1:pjR64lBxnjoSrAr+Ydye/FV73IfrgtoYlAI11a8xMfA= +github.com/sigstore/sigstore v1.8.1/go.mod h1:02SL1158BSj15bZyOFz7m+/nJzLZfFd9A8ab3Kz7w/E= +github.com/sigstore/sigstore/pkg/signature/kms/aws v1.8.1/go.mod h1:RCdYCc1IxCYWzh2IdzdA6Yf7JIY0cMRqH08fpQYechw= +github.com/sigstore/sigstore/pkg/signature/kms/azure v1.8.1/go.mod h1:s13mo3a0UCQS3+PAUUZfvKe48sMDMsHk2GE1b2YfPcU= +github.com/sigstore/sigstore/pkg/signature/kms/gcp v1.8.1/go.mod h1:2OaSQ80EcdyVRSQ3T4d1lsc6Scopblsiq8U2AEk5K1A= +github.com/sigstore/sigstore/pkg/signature/kms/hashivault v1.8.1/go.mod h1:nhIgyu4YwwNgalIwTGsoAzam16jjAn3ADRSWKbWPwGI= github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= @@ -3351,11 +4682,13 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.1/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sivchari/containedctx v1.0.2/go.mod h1:PwZOeqm4/DLoJOqMSIJs3aKqXRX4YO+uXww087KZ7Bw= github.com/sivchari/nosnakecase v1.7.0/go.mod h1:CwDzrzPea40/GB6uynrNLiorAlgFRvRbFSgJx2Gs+QY= github.com/sivchari/tenv v1.7.0/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg= +github.com/skeema/knownhosts v1.2.0/go.mod h1:g4fPeYpque7P0xefxtGzV81ihjC8sX2IqpAoNkjxbMo= github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= github.com/skyrings/skyring-common v0.0.0-20160929130248-d1c0bb1cbd5e h1:jrZSSgPUDtBeJbGXqgGUeupQH8I+ZvGXfhpIahye2Bc= github.com/skyrings/skyring-common v0.0.0-20160929130248-d1c0bb1cbd5e/go.mod h1:d8hQseuYt4rJoOo21lFzYJdhMjmDqLY++ayArbgYjWI= @@ -3377,7 +4710,9 @@ github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJ github.com/sony/gobreaker v0.4.2-0.20210216022020-dd874f9dd33b/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/sony/gobreaker v0.5.0 h1:dRCvqm0P490vZPmy7ppEk2qCnCieBooFJ+YoXGYB+yg= github.com/sony/gobreaker v0.5.0/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= +github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= @@ -3385,8 +4720,9 @@ github.com/spf13/afero v1.2.1/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTd github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= +github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= @@ -3395,9 +4731,11 @@ github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155 github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= +github.com/spf13/cobra v1.2.0/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4= github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= @@ -3408,7 +4746,6 @@ github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= @@ -3420,7 +4757,11 @@ github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5q github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= +github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= +github.com/spiffe/go-spiffe/v2 v2.1.5/go.mod h1:eVDqm9xFvyqao6C+eQensb9ZPkyNEeaUbqbBpOhBnNk= +github.com/spiffe/spire-api-sdk v1.8.7/go.mod h1:4uuhFlN6KBWjACRP3xXwrOTNnvaLp1zJs8Lribtr4fI= github.com/spyzhov/ajson v0.4.2/go.mod h1:63V+CGM6f1Bu/p4nLIN8885ojBdt88TbLoSFzyqMuVA= +github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/stbenjam/no-sprintf-host-port v0.1.1/go.mod h1:TLhvtIvONRzdmkFiio4O8LHsN9N74I+PhRquPsxpL0I= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= @@ -3430,6 +4771,8 @@ github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3 github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25/go.mod h1:lbP8tGiBjZ5YWIc2fzuRpTaz0b/53vT6PEs3QuAWzuU= github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -3438,10 +4781,10 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -3456,6 +4799,7 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= @@ -3465,20 +4809,29 @@ github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNG github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= +github.com/tchap/go-patricia/v2 v2.3.1/go.mod h1:VZRHKAb53DLaG+nA9EaYYiaEx6YztwDlLElMsnSHD4k= github.com/tdakkota/asciicheck v0.1.1/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= github.com/tektoncd/pipeline v0.8.0/go.mod h1:IZzJdiX9EqEMuUcgdnElozdYYRh0/ZRC+NKMLj1K3Yw= github.com/tektoncd/pipeline v0.56.0 h1:Gyti3F5u1ADjI08hG3mGtWgpaaiOfeaxnznL/U/N7tM= github.com/tektoncd/pipeline v0.56.0/go.mod h1:npl5qTu+yU74zqKIkTVnFfu/1pMhJFZjvnCrH6DlfLM= +github.com/tektoncd/plumbing v0.0.0-20220817140952-3da8ce01aeeb/go.mod h1:uJBaI0AL/kjPThiMYZcWRujEz7D401v643d6s/21GAg= github.com/tencentcloud/tencentcloud-sdk-go v1.0.162/go.mod h1:asUz5BPXxgoPGaRgZaVm1iGcUAuHyYUo1nXqKa83cvI= github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= +github.com/testcontainers/testcontainers-go v0.19.0/go.mod h1:3YsSoxK0rGEUzbGD4gUVt1Nm3GJpCIq94GX+2LSf3d4= github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= +github.com/tetratelabs/wazero v1.0.1/go.mod h1:wYx2gNRg8/WihJfSDxA1TIL8H+GkfLYm+bIfbblu9VQ= github.com/thanos-io/thanos v0.11.0/go.mod h1:N/Yes7J68KqvmY+xM6J5CJqEvWIvKSR5sqGtmuD6wDc= +github.com/theupdateframework/go-tuf v0.5.2/go.mod h1:SyMV5kg5n4uEclsyxXJZI2UxPFJNDc4Y+r7wv+MlvTA= +github.com/theupdateframework/go-tuf v0.7.0/go.mod h1:uEB7WSY+7ZIugK6R1hiBMBjQftaFzn7ZCDJcp1tCUug= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tilinna/clock v1.0.2/go.mod h1:ZsP7BcY7sEEz7ktc0IVy8Us6boDrK8VradlKRUGfOao= github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= github.com/timonwong/loggercheck v0.9.3/go.mod h1:wUqnk9yAOIKtGA39l1KLE9Iz0QiTocu/YZoOf+OzFdw= +github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399/go.mod h1:LdwHTNJT99C5fTAzDz0ud328OgXz+gierycbcIx2fRs= github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= @@ -3489,8 +4842,11 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1 github.com/tomarrell/wrapcheck/v2 v2.7.0/go.mod h1:ao7l5p0aOlUNJKI0qVwB4Yjlqutd0IvAB9Rdwyilxvg= github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= +github.com/transparency-dev/merkle v0.0.2/go.mod h1:pqSy+OXefQ1EDUVmAJ8MUhHB9TXGuzVAT58PqBoHz1A= github.com/trivago/tgo v1.0.7 h1:uaWH/XIy9aWYWpjm2CU3RpcqZXmX2ysQ9/Go+d9gyrM= github.com/trivago/tgo v1.0.7/go.mod h1:w4dpD+3tzNIIiIfkWWa85w5/B77tlvdZckQ+6PkFnhc= +github.com/tsenart/go-tsz v0.0.0-20180814232043-cdeb9e1e981e/go.mod h1:SWZznP1z5Ki7hDT2ioqiFKEse8K9tU2OUvaRI0NeGQo= +github.com/tsenart/vegeta/v12 v12.8.4/go.mod h1:ZiJtwLn/9M4fTPdMY7bdbIeyNeFVE8/AHbWFqCsUuho= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= @@ -3499,7 +4855,9 @@ github.com/uber/jaeger-client-go v2.20.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMW github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go v1.1.1/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= @@ -3510,9 +4868,14 @@ github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lP github.com/ultraware/whitespace v0.0.5/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.18.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.19.1/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.7/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.12/go.mod h1:sSBEIC79qR6OvcmsD4U3KABeOTxDqQtdDnaFuUN30b8= +github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/urfave/negroni v1.0.1-0.20181201104632-7183f09c600e/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/uudashr/gocognit v1.0.6/go.mod h1:nAIUuVBnYU7pcninia3BHOvQkpQCeO76Uscky5BOwcY= @@ -3524,24 +4887,42 @@ github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+ github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= github.com/vbatts/tar-split v0.9.14-0.20160330203851-226f7c74905f/go.mod h1:LEuURwDEiWjRjwu46yU3KVGuUdVv/dcnpcEPSzR8z6g= +github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= +github.com/vbatts/tar-split v0.11.3/go.mod h1:9QlHN18E+fEH7RdG+QAJJcuya3rqT7eXSTY7wGrAokY= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= +github.com/vektah/gqlparser/v2 v2.4.5/go.mod h1:flJWIR04IMQPGz+BXLrORkrARBxv/rtyIAFvd/MceW0= +github.com/veraison/go-cose v1.0.0-rc.1/go.mod h1:7ziE85vSq4ScFTg6wyoMXjucIGOf4JkFEZi/an96Ct4= github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG03GafCjFohMDmz6Zc6oCuiqgH6tGNyXTkHzXE= github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netlink v1.2.1-beta.2/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= +github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= github.com/vmware/govmomi v0.18.0/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= github.com/vmware/govmomi v0.22.2/go.mod h1:Y+Wq4lst78L85Ge/F8+ORXIWiKYqaro1vhAulACy9Lc= github.com/vmware/govmomi v0.30.4 h1:BCKLoTmiBYRuplv3GxKEMBLtBaJm8PA56vo9bddIpYQ= github.com/vmware/govmomi v0.30.4/go.mod h1:F7adsVewLNHsW/IIm7ziFURaXDaHEwcc+ym4r3INMdY= github.com/vmware/vmw-guestinfo v0.0.0-20170707015358-25eff159a728/go.mod h1:x9oS4Wk2s2u4tS29nEaDLdzvuHdB19CvSGJjPgkZJNk= +github.com/vultr/govultr/v2 v2.17.2/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI= +github.com/weppos/publicsuffix-go v0.12.0/go.mod h1:z3LCPQ38eedDQSwmsSRW4Y7t2L8Ln16JPQ02lHAdn5k= +github.com/weppos/publicsuffix-go v0.13.0/go.mod h1:z3LCPQ38eedDQSwmsSRW4Y7t2L8Ln16JPQ02lHAdn5k= +github.com/weppos/publicsuffix-go v0.15.1-0.20220329081811-9a40b608a236/go.mod h1:HYux0V0Zi04bHNwOHy4cXJVz/TQjYonnF6aoYhj+3QE= +github.com/weppos/publicsuffix-go v0.20.1-0.20221031080346-e4081aa8a6de/go.mod h1:g9GsAxnaxsUuTLZcQdYbi43vT2k9ubZGHsdCy819VLk= +github.com/weppos/publicsuffix-go v0.30.0/go.mod h1:kBi8zwYnR0zrbm8RcuN1o9Fzgpnnn+btVN8uWPMyXAY= +github.com/weppos/publicsuffix-go v0.30.1-0.20230620154423-38c92ad2d5c6/go.mod h1:wdMq89hDN07Zqr0yqYAXIBTJXl4MEELx+HYHOZdf5gM= +github.com/weppos/publicsuffix-go/publicsuffix/generator v0.0.0-20220927085643-dc0d00c92642/go.mod h1:GHfoeIdZLdZmLjMlzBftbTDntahTttUMWjxZwQJhULE= github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= +github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= @@ -3563,9 +4944,16 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1: github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xhit/go-str2duration v1.2.0/go.mod h1:3cPSlfZlUHVlneIVfePFWcJZsuwf+P1v2SRTV4cUmp4= +github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= github.com/xiang90/probing v0.0.0-20160813154853-07dd2e8dfe18/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xitongsys/parquet-go v1.5.1/go.mod h1:xUxwM8ELydxh4edHGegYq1pA8NnMKDx0K/GyB0o2bww= +github.com/xitongsys/parquet-go v1.6.2/go.mod h1:IulAQyalCm0rPiZVNnCgm/PCL64X2tdSVGMQ/UeKqWA= +github.com/xitongsys/parquet-go-source v0.0.0-20190524061010-2b72cbee77d5/go.mod h1:xxCx7Wpym/3QCo6JhujJX51dzSXrwmb0oH6FQb39SEA= +github.com/xitongsys/parquet-go-source v0.0.0-20200817004010-026bad9b25d0/go.mod h1:HYhIKsdns7xz80OgkbgJYrtQY7FjHWHKH6cvN7+czGE= +github.com/xitongsys/parquet-go-source v0.0.0-20220315005136-aec0fe3e777c/go.mod h1:qLb2Itmdcp7KPa5KZKvhE9U1q5bYSOmgeOckF/H2rQA= github.com/xlab/handysort v0.0.0-20150421192137-fb3537ed64a1/go.mod h1:QcJo0QPSfTONNIgpN5RA8prR7fF8nkF6cTWTcNerRO8= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= @@ -3574,10 +4962,19 @@ github.com/xlab/treeprint v1.1.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= +github.com/yashtewari/glob-intersection v0.1.0/go.mod h1:LK7pIC3piUjovexikBbJ26Yml7g8xa5bsjfx2v1fwok= github.com/yeya24/promlinter v0.2.0/go.mod h1:u54lkmBOZrpEbQQ6gox2zWKKLKu2SGe+2KOiextY+IA= github.com/yhat/scrape v0.0.0-20161128144610-24b7890b0945/go.mod h1:4vRFPPNYllgCacoj+0FoKOjTW68rUhEfqPLiEJaK2w8= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/ysmood/fetchup v0.2.2/go.mod h1:xhibcRKziSvol0H1/pj33dnKrYyI2ebIvz5cOOkYGns= +github.com/ysmood/fetchup v0.2.3/go.mod h1:xhibcRKziSvol0H1/pj33dnKrYyI2ebIvz5cOOkYGns= +github.com/ysmood/goob v0.4.0/go.mod h1:u6yx7ZhS4Exf2MwciFr6nIM8knHQIE22lFpWHnfql18= +github.com/ysmood/gop v0.0.2/go.mod h1:rr5z2z27oGEbyB787hpEcx4ab8cCiPnKxn0SUHt6xzk= +github.com/ysmood/got v0.34.1/go.mod h1:yddyjq/PmAf08RMLSwDjPyCvHvYed+WjHnQxpH851LM= +github.com/ysmood/gotrace v0.6.0/go.mod h1:TzhIG7nHDry5//eYZDYcTzuJLYQIkykJzCRIo4/dzQM= +github.com/ysmood/gson v0.7.3/go.mod h1:3Kzs5zDl21g5F/BlLTNcuAGAYLKt2lV5G8D1zF3RNmg= +github.com/ysmood/leakless v0.8.0/go.mod h1:R8iAXPRaG97QJwqxs74RdwzcRHT1SWCGTNqY8q0JvMQ= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= @@ -3601,8 +4998,22 @@ github.com/yvasiyarov/gorelic v0.0.7/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96Tg github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20160601141957-9c099fbc30e9 h1:AsFN8kXcCVkUFHyuzp1FtYbzp1nCO/H6+1uPSGEyPzM= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20160601141957-9c099fbc30e9/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/errs v1.3.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= +github.com/zmap/rc2 v0.0.0-20131011165748-24b9757f5521/go.mod h1:3YZ9o3WnatTIZhuOtot4IcUfzoKVjUHqu6WALIyI0nE= +github.com/zmap/rc2 v0.0.0-20190804163417-abaa70531248/go.mod h1:3YZ9o3WnatTIZhuOtot4IcUfzoKVjUHqu6WALIyI0nE= +github.com/zmap/zcertificate v0.0.0-20180516150559-0e3d58b1bac4/go.mod h1:5iU54tB79AMBcySS0R2XIyZBAVmeHranShAFELYx7is= +github.com/zmap/zcertificate v0.0.1/go.mod h1:q0dlN54Jm4NVSSuzisusQY0hqDWvu92C+TWveAxiVWk= +github.com/zmap/zcrypto v0.0.0-20201128221613-3719af1573cf/go.mod h1:aPM7r+JOkfL+9qSB4KbYjtoEzJqUK50EXkkJabeNJDQ= +github.com/zmap/zcrypto v0.0.0-20201211161100-e54a5822fb7e/go.mod h1:aPM7r+JOkfL+9qSB4KbYjtoEzJqUK50EXkkJabeNJDQ= +github.com/zmap/zcrypto v0.0.0-20220402174210-599ec18ecbac/go.mod h1:egdRkzUylATvPkWMpebZbXhv0FMEMJGX/ur0D3Csk2s= +github.com/zmap/zcrypto v0.0.0-20230310154051-c8b263fd8300/go.mod h1:mOd4yUMgn2fe2nV9KXsa9AyQBFZGzygVPovsZR+Rl5w= +github.com/zmap/zlint/v3 v3.0.0/go.mod h1:paGwFySdHIBEMJ61YjoqT4h7Ge+fdYG4sUQhnTb1lJ8= +github.com/zmap/zlint/v3 v3.4.0/go.mod h1:WgepL2QqxyMHnrOWJ54NqrgfMtOyuXr52wEE0tcfo9k= +github.com/zmap/zlint/v3 v3.5.0/go.mod h1:JkNSrsDJ8F4VRtBZcYUQSvnWFL7utcjDIn+FE64mlBI= github.com/zoido/yag-config v0.4.0/go.mod h1:HcK2GbfzhDVmgwP4miBIfD2qKz6Y5LAJayebVhie/nE= gitlab.com/bosi/decorder v0.2.3/go.mod h1:9K1RB5+VPNQYtXtTDAzd2OEftsZb1oV0IrJrzChSdGE= go.elastic.co/apm v1.5.0/go.mod h1:OdB9sPtM6Vt7oz3VXt7+KR96i9li74qrxBGHTQygFvk= @@ -3615,6 +5026,7 @@ go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= +go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= go.etcd.io/etcd v0.0.0-20181031231232-83304cfc808c/go.mod h1:weASp41xM3dk0YHg1s/W8ecdGP5G4teSTMBPpYAaUgA= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.etcd.io/etcd v0.0.0-20200513171258-e048e166ab9c/go.mod h1:xCI7ZzBfRuGgBXyXO6yfWfDmlWd35khcWpUa4L0xI/k= @@ -3627,14 +5039,25 @@ go.etcd.io/etcd/api/v3 v3.5.8/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+ go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.8/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= +go.etcd.io/etcd/client/v2 v2.305.8/go.mod h1:ZlAsxDK5/10I6xVHhFo9zinCMr/DDLKFetDDXlzKwqE= go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= +go.etcd.io/etcd/client/v3 v3.5.8/go.mod h1:idZYIPVkttBJBiRigkB5EM0MmEyx8jcl18zCV3F5noc= +go.etcd.io/etcd/etcdctl/v3 v3.5.8/go.mod h1:ur5LRmFUo1Rcnwe8i71YVtH5y4RjsW/6YNmTQlz1N8E= +go.etcd.io/etcd/etcdutl/v3 v3.5.8/go.mod h1:ttDqxIhpW9PqQdw+jJhUpLF+f37TnnSRJpkJSkCikts= go.etcd.io/etcd/pkg/v3 v3.5.4/go.mod h1:OI+TtO+Aa3nhQSppMbwE4ld3uF1/fqqwbpfndbbrEe0= +go.etcd.io/etcd/pkg/v3 v3.5.8/go.mod h1:C17MJkZHJIyJV+wWWx6Jz6YS6BfdkOnUkSwT9uuEO7s= go.etcd.io/etcd/raft/v3 v3.5.4/go.mod h1:SCuunjYvZFC0fBX0vxMSPjuZmpcSk+XaAcMrD6Do03w= +go.etcd.io/etcd/raft/v3 v3.5.8/go.mod h1:W6P5WxtOMfYNdLSEJX3vc8Pg6LOt+ewI9UCFKcnIexA= go.etcd.io/etcd/server/v3 v3.5.4/go.mod h1:S5/YTU15KxymM5l3T6b09sNOHPXqGYIZStpuuGbb65c= +go.etcd.io/etcd/server/v3 v3.5.8/go.mod h1:1y2ahPOrlE4pzVV5+rBCDur7QQcEP0MNUPO2dyzwjso= +go.etcd.io/etcd/tests/v3 v3.5.8/go.mod h1:KFgEgZWwXZILKsOX3f3VyGmUHQgbG/yM9edQNTkXsdE= +go.etcd.io/etcd/v3 v3.5.8/go.mod h1:vptUbt0q/yZF9X3xyZ0Q7XHoYJ8okR64FCRpZjz4Zyg= +go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= go.mongodb.org/atlas v0.13.0/go.mod h1:wVCnHcm/7/IfTjEB6K8K35PLG70yGz8BdkRwX0oK9/M= go.mongodb.org/atlas v0.15.0/go.mod h1:lQhRHIxc6jQHEK3/q9WLu/SdBkPj2fQYhjLGUF6Z3U8= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= @@ -3647,7 +5070,11 @@ go.mongodb.org/mongo-driver v1.4.4/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4S go.mongodb.org/mongo-driver v1.4.6/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= go.mongodb.org/mongo-driver v1.5.1/go.mod h1:gRXCHX4Jo7J0IJ1oDQyUxF7jfy19UfxniMS4xxMmUqw= go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg= +go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= +go.mongodb.org/mongo-driver v1.8.3/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY= go.mongodb.org/mongo-driver v1.10.0/go.mod h1:wsihk0Kdgv8Kqu1Anit4sfK+22vSFbUrAVEYRhCXrA8= +go.mongodb.org/mongo-driver v1.11.0/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8= +go.mongodb.org/mongo-driver v1.11.2/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8= go.mongodb.org/mongo-driver v1.11.3/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g= go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80= go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= @@ -3672,38 +5099,110 @@ go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= go.opentelemetry.io/contrib/instrumentation/github.com/emicklei/go-restful/otelrestful v0.20.0/go.mod h1:oQkZOyq61qZBItEFqhfpobK6X/oDPR7/Qr+MXjVSTks= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.25.0/go.mod h1:E5NNboN0UqSAki0Atn9kVwaN7I+l25gGxDqBueo/74E= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.41.0/go.mod h1:YjmsSWM1VTcWXFSgyrmLADPMZZohioz9onjgkikk59w= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.45.0/go.mod h1:vsh3ySueQCiKPxFLvjWC4Z135gIa34TQ/NSqkDTZYUM= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.48.0 h1:P+/g8GpuJGYbOp2tAdKrIPUX9JO02q8Q0YNlHolpibA= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.48.0/go.mod h1:tIKj3DbO8N9Y2xo52og3irLsPI4GW02DSMtrVgNMgxg= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.31.0/go.mod h1:PFmBsWbldL1kiWZk9+0LBZz2brhByaGsvp6pRICMlPE= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0/go.mod h1:5eCOqeGphOyz6TsY3ZDNjE33SM/TFAK3RGuCL2naTgY= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.40.0/go.mod h1:pcQ3MM3SWvrA71U4GDqv9UFDJ3HQsW7y5ZO3tDTlUdI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.41.0/go.mod h1:xmv4aGDeCpkNeyGH0iKgaj/E6XPeRqG20QF2IC7UXr0= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0/go.mod h1:62CPTSry9QZtOaSsE3tOzhx6LzDhHnXJ6xHeMNNiM6Q= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.48.0 h1:doUP+ExOpH3spVTLS0FcWGLnQrPct/hD/bCPbDRUEAU= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.48.0/go.mod h1:rdENBZMT2OE6Ne/KLwpiXudnAsbdrdBaqBvTN8M8BgA= go.opentelemetry.io/contrib/propagators v0.20.0/go.mod h1:yLmt93MeSiARUwrK57bOZ4FBruRN4taLiW1lcGfnOes= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= +go.opentelemetry.io/otel v1.0.1/go.mod h1:OPEOD4jIT2SlZPMmwT6FqZz2C0ZNdQqiWcoK6M0SNFU= go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= +go.opentelemetry.io/otel v1.6.0/go.mod h1:bfJD2DZVw0LBxghOTlgnlI0CV3hLDu9XF/QKOUXMTQQ= +go.opentelemetry.io/otel v1.6.1/go.mod h1:blzUabWHkX6LJewxvadmzafgh/wnvBSDBdOuwkAtrWQ= +go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk= +go.opentelemetry.io/otel v1.11.1/go.mod h1:1nNhXBbWSD0nsL38H6btgnFN2k4i0sNLHNNMZMSbUGE= +go.opentelemetry.io/otel v1.14.0/go.mod h1:o4buv+dJzx8rohcUeRmWUZhqupFvzWis188WlggnNeU= +go.opentelemetry.io/otel v1.15.0/go.mod h1:qfwLEbWhLPk5gyWrne4XnF0lC8wtywbuJbgfAE3zbek= +go.opentelemetry.io/otel v1.17.0/go.mod h1:I2vmBGtFaODIVMBSTPVDlJSzBDNf93k60E6Ft0nyjo0= +go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= +go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= go.opentelemetry.io/otel v1.23.0 h1:Df0pqjqExIywbMCMTxkAwzjLZtRf+bBKLbUcpxO2C9E= go.opentelemetry.io/otel v1.23.0/go.mod h1:YCycw9ZeKhcJFrb34iVSkyT0iczq/zYDtZYFufObyB0= +go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI= go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.6.1/go.mod h1:NEu79Xo32iVb+0gVNV8PMd7GoWqnyDXRlj04yFjqz40= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0/go.mod h1:M1hVZHNxcbkAlcvrOMlpQ4YOO3Awf+4N2dxkZL3xm04= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.14.0/go.mod h1:UFG7EBMRdXyFstOwH028U0sVf+AvukSGhF0g8+dmNG8= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.15.0/go.mod h1:uOTV75+LOzV+ODmL8ahRLWkFA3eQcSC2aAsbxIu4duk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.1/go.mod h1:Kv8liBeVNFkkkbilbgWRpV+wWuu+H5xdOT6HAgd30iw= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.6.1/go.mod h1:YJ/JbY5ag/tSQFXzH3mtDmHqzF3aFn3DI/aB1n7pt4w= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0/go.mod h1:ceUgdyfNv4h4gLxHR0WNfDiiVmZFodZhZSbOLhpxqXE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.14.0/go.mod h1:HrbCVv40OOLTABmOn1ZWty6CHXkU8DK/Urc43tHug70= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.15.0/go.mod h1:pvkFJxNUXyJ5i8u6m8NIcqkoOf/65VM2mSyBbBJfeVQ= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.1/go.mod h1:xOvWoTOrQjxjW61xtOmD/WKGRYb/P4NzRo3bs65U6Rk= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.6.1/go.mod h1:UJJXJj0rltNIemDMwkOJyggsvyMG9QHfJeFH0HS5JjM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0/go.mod h1:E+/KKhwOSw8yoPxSSuUHG6vKppkvhN+S1Jc7Nib3k3o= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.14.0/go.mod h1:5w41DY6S9gZrbjuq6Y+753e96WfPha5IcsOSZTtullM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.15.0/go.mod h1:RPagkaZrpwD+rSwQjzos6rBLsHOvenOqufCj4/7I46E= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0/go.mod h1:0+KuTDyKL4gjKCF75pHOX4wuzYDUZYfAQdSu43o+Z2I= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.6.1/go.mod h1:DAKwdo06hFLc0U88O10x4xnb5sc7dDRDqRuiN+io8JE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.14.0/go.mod h1:+N7zNjIJv4K+DeX67XXET0P+eIciESgaFDBqh+ZJFS4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= +go.opentelemetry.io/otel/metric v0.28.0/go.mod h1:TrzsfQAmQaB1PDcdhBauLMk7nyyg9hm+GoQq/ekE9Iw= +go.opentelemetry.io/otel/metric v0.30.0/go.mod h1:/ShZ7+TS4dHzDFmfi1kSXMhMVubNoP0oIaBp70J6UXU= +go.opentelemetry.io/otel/metric v0.37.0/go.mod h1:DmdaHfGt54iV6UKxsV9slj2bBRJcKC1B1uvDLIioc1s= +go.opentelemetry.io/otel/metric v0.38.0/go.mod h1:uAtxN5hl8aXh5irD8afBtSwQU5Zjg64WWSz6KheZxBg= +go.opentelemetry.io/otel/metric v1.17.0/go.mod h1:h4skoxdZI17AxwITdmdZjjYJQH5nzijUUjm+wtPph5o= +go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= +go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= go.opentelemetry.io/otel/metric v1.23.0 h1:pazkx7ss4LFVVYSxYew7L5I6qvLXHA0Ap2pwV+9Cnpo= go.opentelemetry.io/otel/metric v1.23.0/go.mod h1:MqUW2X2a6Q8RN96E2/nqNoT+z9BSms20Jb7Bbp+HiTo= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= +go.opentelemetry.io/otel/sdk v1.0.1/go.mod h1:HrdXne+BiwsOHYYkBE5ysIcv2bvdZstxzmCQhxTcZkI= go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= +go.opentelemetry.io/otel/sdk v1.6.1/go.mod h1:IVYrddmFZ+eJqu2k38qD3WezFR2pymCzm8tdxyh3R4E= +go.opentelemetry.io/otel/sdk v1.7.0/go.mod h1:uTEOTwaqIVuTGiJN7ii13Ibp75wJmYUDe374q6cZwUU= +go.opentelemetry.io/otel/sdk v1.11.1/go.mod h1:/l3FE4SupHJ12TduVjUkZtlfFqDCQJlOlithYrdktys= +go.opentelemetry.io/otel/sdk v1.14.0/go.mod h1:bwIC5TjrNG6QDCHNWvW4HLHtUQ4I+VQDsnjhvyZCALM= +go.opentelemetry.io/otel/sdk v1.15.0/go.mod h1:XDEMrYWzJ4YlC17i6Luih2lwDw2j6G0PkUfr1ZqE+rQ= +go.opentelemetry.io/otel/sdk v1.17.0/go.mod h1:U87sE0f5vQB7hwUoW98pW5Rz4ZDuCFBZFNUBlSgmDFQ= +go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= +go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= go.opentelemetry.io/otel/sdk v1.22.0 h1:6coWHw9xw7EfClIC/+O31R8IY3/+EiRFHevmHafB2Gw= go.opentelemetry.io/otel/sdk v1.22.0/go.mod h1:iu7luyVGYovrRpe2fmj3CVKouQNdTOkxtLzPvPz1DOc= go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= +go.opentelemetry.io/otel/trace v1.0.1/go.mod h1:5g4i4fKLaX2BQpSBsxw8YYcgKpMMSW3x7ZTuYBr3sUk= go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= +go.opentelemetry.io/otel/trace v1.6.0/go.mod h1:qs7BrU5cZ8dXQHBGxHMOxwME/27YH2qEp4/+tZLLwJE= +go.opentelemetry.io/otel/trace v1.6.1/go.mod h1:RkFRM1m0puWIq10oxImnGEduNBzxiN7TXluRBtE+5j0= +go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU= +go.opentelemetry.io/otel/trace v1.11.1/go.mod h1:f/Q9G7vzk5u91PhbmKbg1Qn0rzH1LJ4vbPHFGkTPtOk= +go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+gozhnZjy/rw9G8= +go.opentelemetry.io/otel/trace v1.15.0/go.mod h1:CUsmE2Ht1CRkvE8OsMESvraoZrrcgD1J2W8GV1ev0Y4= +go.opentelemetry.io/otel/trace v1.17.0/go.mod h1:I/4vKTgFclIsXRVucpH25X0mpFSczM7aHeaz0ZBLWjY= +go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= +go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= go.opentelemetry.io/otel/trace v1.23.0 h1:37Ik5Ib7xfYVb4V1UtnT97T1jI+AoIYkJyPkuL4iJgI= go.opentelemetry.io/otel/trace v1.23.0/go.mod h1:GSGTbIClEsuZrGIzoEHqsVfxgn5UkggkflQwDScNUsk= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSsOPU9brfSHJg= go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= +go.opentelemetry.io/proto/otlp v0.12.1/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v0.16.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.pedge.io/pb v0.0.0-20171203174523-dbc791b8a69c/go.mod h1:GkGa0JfsGuOWpsyfhrOgESFpERl3k6SFcjPCItfr+04= go.pedge.io/proto v0.0.0-20170422232847-c5da4db108f6/go.mod h1:PloHtlON9Mj1YdxURycTKxSn+p+4Ro9mK/5jMl/v//Y= go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc= @@ -3717,20 +5216,25 @@ go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/automaxprocs v1.2.0/go.mod h1:YfO3fm683kQpzETxlTGZhGIVmXAhaw3gxeBADbpZtnU= +go.uber.org/automaxprocs v1.4.0/go.mod h1:/mTEdr7LvHhs0v7mjdxDreTz1OG5zdZGqgOnhWiR/+Q= +go.uber.org/automaxprocs v1.5.1/go.mod h1:BF4eumQw0P9GtnuxxovUd06vwm1o18oMzFtK66vU6XU= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= +go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= +go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= +go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= @@ -3745,19 +5249,23 @@ go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= gocloud.dev v0.20.0 h1:mbEKMfnyPV7W1Rj35R1xXfjszs9dXkwSOq2KoFr25g8= gocloud.dev v0.20.0/go.mod h1:+Y/RpSXrJthIOM8uFNzWp6MRu9pFPNFEEZrQMxpkfIc= +goji.io/v3 v3.0.0/go.mod h1:c02FFnNiVNCDo+DpR2IhBQpM9r5G1BG/MkHNTPUJ13U= +golang.org/x/arch v0.0.0-20180920145803-b19384d3c130/go.mod h1:cYlCBUl1MsqxdiKgmc4uh7TxZfWSFLOGSRR090WDxt8= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.1.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180608092829-8ac0e0d97ce4/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181015023909-0c41d7ab0a0e/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190103213133-ff983b9c42bc/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -3774,15 +5282,17 @@ golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191010185427-af544f31c8ac/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191112222119-e1110fd1c708/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20191117063200-497ca9f6d64f/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -3791,17 +5301,24 @@ golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20201208171446-5f87f3452ae9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20211202192323-5770296d904e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220208050332-20e1d8d225ab/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= @@ -3814,13 +5331,24 @@ golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220817201139-bc19a97f63c8/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220826181053-bd7e27e6170d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20221012134737-56aed061732a/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -3832,6 +5360,7 @@ golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxT golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= @@ -3841,8 +5370,12 @@ golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMk golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/exp v0.0.0-20210220032938-85be41e4509f/go.mod h1:I6l2HNBLBZEcrOoCpyKLdY2lHoRZ8lI4x60KMCQDft4= golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= -golang.org/x/exp v0.0.0-20230728194245-b0cb94b80691 h1:/yRP+0AN7mf5DkD3BAI6TOFnd51gEoDEb8o35jIFtgw= -golang.org/x/exp v0.0.0-20230728194245-b0cb94b80691/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= +golang.org/x/exp v0.0.0-20230108222341-4b8118a2686a/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20230307190834-24139beb5833/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/exp/typeparams v0.0.0-20220613132600-b0d781184e0d/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= @@ -3850,6 +5383,16 @@ golang.org/x/exp/typeparams v0.0.0-20220827204233-334a2380cb91/go.mod h1:AbB0pIl golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181217174547-8f45f776aaf1/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -3887,10 +5430,10 @@ golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20171107184841-a337091b0525/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -3927,8 +5470,8 @@ golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190930134127-c5a3c61f89f3/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191009170851-d66e71096ffb/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191119073136-fc4aabc6c914/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -3968,12 +5511,15 @@ golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -3986,24 +5532,36 @@ golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220805013720-a33c5aa5df48/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20220906165146-f3363e06e74c/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20220921155015-db77216a4ee9/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20220926192436-02166a98028e/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221004154528-8021a29435af/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.3.1-0.20221206200815-1e63c2f08a10/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180724155351-3d292e4d0cdc/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -4025,6 +5583,7 @@ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= @@ -4037,10 +5596,22 @@ golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j golang.org/x/oauth2 v0.0.0-20220524215830-622c5d57e401/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220722155238-128564f6959c/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= +golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= +golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= +golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= +golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= +golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= +golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= +golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= +golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= +golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= +golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= golang.org/x/oauth2 v0.17.0 h1:6m3ZPmLEFdVxKKWnKq4VqZ60gutO35zm+zrAHVmHyDQ= golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -4059,16 +5630,18 @@ golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220923202941-7f9b1623fab7/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180903190138-2b024373dcd9/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -4077,11 +5650,12 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181218192612-074acd46bca6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190116161447-11f53e031339/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190310054646-10058d7d4faa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -4128,6 +5702,7 @@ golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191113165036-4c7a9d0fe056/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191119060738-e882bf8e40c2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -4173,11 +5748,11 @@ golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201223074533-0d417f636930/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -4186,6 +5761,7 @@ golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210301091718-77cc2087c03b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -4196,6 +5772,7 @@ golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -4208,11 +5785,13 @@ golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210921065528-437939a70204/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -4220,6 +5799,7 @@ golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211025112917-711f33c9992c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211031064116-611d5d643895/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -4233,7 +5813,9 @@ golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220207234003-57398862261d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220325203850-36772127a21f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220405210540-1e041c57c461/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220406163625-3f8b81556e12/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -4254,22 +5836,28 @@ golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220906165534-d0df966e6959/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220913175220-63ea55921009/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220915200043-7b5979e65e41/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= @@ -4277,28 +5865,32 @@ golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9sn golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= -golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.1.1-0.20171102192421-88f656faf3f3/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180805044716-cb6730876b98/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.1/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -4312,16 +5904,15 @@ golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.0.0-20170424234030-8be79e1e0910/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190921001708-c4c64cad1fd0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -4330,10 +5921,12 @@ golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220411224347-583f2d630306/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220609170525-579cf78fd858/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.2.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= @@ -4341,7 +5934,6 @@ golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181219222714-6e267b5cc78e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -4378,6 +5970,7 @@ golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20190718200317-82a3ea8a504c/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20190813034749-528a2984e271/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -4387,6 +5980,7 @@ golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20190916130336-e45ffcd953cc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190918214516-5a1a30219888/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190930201159-7c411dea38b0/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -4397,6 +5991,7 @@ golang.org/x/tools v0.0.0-20191111182352-50fa39b762bc/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191118222007-07fc4c7f2b98/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -4416,6 +6011,7 @@ golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200313205530-4303120df7d8/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200317043434-63da46f3035e/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200325010219-a49f79bcc224/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= @@ -4427,6 +6023,7 @@ golang.org/x/tools v0.0.0-20200416214402-fc959738d646/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200601175630-2caf76543d99/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -4455,6 +6052,7 @@ golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4X golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -4463,6 +6061,7 @@ golang.org/x/tools v0.0.0-20210101214203-2dba1e4ea05c/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210112230658-8b4aab62c064/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= @@ -4471,6 +6070,8 @@ golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.6-0.20210820212750-d4cc65f0b2ff/go.mod h1:YD9qOF0M9xpSpdWTBbzEl5e/RnCefISl8E5Noe10jFM= golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.9-0.20211228192929-ee1ca4ffc4da/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= @@ -4482,12 +6083,15 @@ golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4 golang.org/x/tools v0.1.12-0.20220628192153-7743d1d949f1/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4= golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.10.0/go.mod h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM= golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= @@ -4510,9 +6114,14 @@ gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuB gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= gonum.org/v1/gonum v0.6.2/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.0.0-20181021000519-a2651947f503/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= @@ -4549,6 +6158,7 @@ google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjR google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= +google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= @@ -4557,6 +6167,7 @@ google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6 google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= google.golang.org/api v0.60.0/go.mod h1:d7rl65NZAkEQ90JFzqBjcRq1TVeG5ZoGV3sSpEnnVb4= google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= @@ -4584,6 +6195,23 @@ google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91 google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= +google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= +google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= +google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= +google.golang.org/api v0.118.0/go.mod h1:76TtD3vkgmZ66zZzp72bUUklpmQmKlhh6sYtIjYK+5E= +google.golang.org/api v0.121.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= +google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= +google.golang.org/api v0.123.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= +google.golang.org/api v0.124.0/go.mod h1:xu2HQurE5gi/3t1aFCvhPD781p0a3p11sdunTJ2BlP4= +google.golang.org/api v0.125.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= +google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= +google.golang.org/api v0.128.0/go.mod h1:Y611qgqaE92On/7g65MQgxYul3c0rEB894kniWLY750= +google.golang.org/api v0.139.0/go.mod h1:CVagp6Eekz9CjGZ718Z+sloknzkDJE7Vc1Ckj9+viBk= +google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI= +google.golang.org/api v0.156.0/go.mod h1:bUSmn4KFO0Q+69zo9CNIDp4Psi6BqM0np0CbzKRSiSY= google.golang.org/api v0.166.0 h1:6m4NUwrZYhAaVIHZWxaKjw1L1vNAjtMwORmKRyEEo24= google.golang.org/api v0.166.0/go.mod h1:4FcBc686KFi7QI/U51/2GKKevfZMpM17sCdibqe/bSA= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= @@ -4621,7 +6249,6 @@ google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191114150713-6bbd007550de/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= @@ -4674,7 +6301,9 @@ google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= @@ -4690,9 +6319,11 @@ google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEc google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211021150943-2b146023228c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= @@ -4712,6 +6343,7 @@ google.golang.org/genproto v0.0.0-20220301145929-1ac2ace0dbf7/go.mod h1:kGP+zUP2 google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= @@ -4749,14 +6381,104 @@ google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= +google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= google.golang.org/genproto v0.0.0-20221205194025-8222ab48f5fc/go.mod h1:1dOng4TWOomJrDGhpXjfCD35wQC6jnC7HpRmOFRqEV0= +google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= +google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230301171018-9ab4bdc49ad5/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= +google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= +google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= +google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= +google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= +google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= +google.golang.org/genproto v0.0.0-20230629202037-9506855d4529/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= +google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y= +google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0= +google.golang.org/genproto v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:0ggbjUrZYpy1q+ANUS30SEoGZ53cdfwtbuG7Ptgy108= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= +google.golang.org/genproto v0.0.0-20230821184602-ccc8af3d0e93/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= +google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= +google.golang.org/genproto v0.0.0-20230913181813-007df8e322eb/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= +google.golang.org/genproto v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:CCviP9RmpZ1mxVr8MUjCnSiY09IbAXZxhLE6EhHIdPU= +google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97/go.mod h1:t1VqOqqvce95G3hIDCT5FeO3YUc6Q4Oe24L/+rNMxRk= +google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:EMfReVxb80Dq1hhioy0sOsY9jCE46YDgHlJ7fWVUWRE= +google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:CgAqfJo+Xmu0GwA0411Ht3OU3OntXwsGmrmjI8ioGXI= +google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4= +google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= +google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f/go.mod h1:nWSwAFPb+qfNJXsoeO3Io7zf4tMSfN8EA8RlDA04GhY= +google.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic= +google.golang.org/genproto v0.0.0-20231212172506-995d672761c0/go.mod h1:l/k7rMz0vFTBPy+tFSGvXEd3z+BcoG1k7EHbqm+YBsY= google.golang.org/genproto v0.0.0-20240304212257-790db918fca8 h1:Fe8QycXyEd9mJgnwB9kmw00WgB43eQ/xYO5C6gceybQ= google.golang.org/genproto v0.0.0-20240304212257-790db918fca8/go.mod h1:yA7a1bW1kwl459Ol0m0lV4hLTfrL/7Bkk4Mj2Ir1mWI= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230629202037-9506855d4529/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:mPBs5jNgx2GuQGvFwUvVKqtn6HsUw9nP64BedgvqEsQ= +google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= +google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= +google.golang.org/genproto/googleapis/api v0.0.0-20230803162519-f966b187b2e5/go.mod h1:5DZzOUPCLYL3mNkQ0ms0F3EuUNZ7py1Bqeq6sxzI7/Q= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/api v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:RdyHbowztCGQySiCvQPgWQWgWhGnouTdCflKoDBt32U= +google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97/go.mod h1:iargEX0SFPm3xcfMI0d1domjg0ZF4Aa0p2awqyxhvF0= +google.golang.org/genproto/googleapis/api v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:SUBoKXbI1Efip18FClrQVGjWcyd0QZd8KkvdP34t7ww= +google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870= +google.golang.org/genproto/googleapis/api v0.0.0-20231030173426-d783a09b4405/go.mod h1:oT32Z4o8Zv2xPQTg0pbVaPr0MPOH6f14RgXt7zfIpwg= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= +google.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f/go.mod h1:Uy9bTZJqmfrw2rIBxgGLnamc78euZULUBrLZ9XTITKI= +google.golang.org/genproto/googleapis/api v0.0.0-20231211222908-989df2bf70f3/go.mod h1:k2dtGpRrbsSyKcNPKKI5sstZkrNCZwpU/ns96JoHbGg= +google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0/go.mod h1:CAny0tYF+0/9rmDB9fahA9YLzX3+AEVl1qXbv5hhj6c= google.golang.org/genproto/googleapis/api v0.0.0-20240304212257-790db918fca8 h1:8eadJkXbwDEMNwcB5O0s5Y5eCfyuCLdvaiOIaGTrWmQ= google.golang.org/genproto/googleapis/api v0.0.0-20240304212257-790db918fca8/go.mod h1:O1cOfN1Cy6QEYr7VxtjOyP5AdAuR0aJ/MYZaaof623Y= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20230807174057-1744710a1577/go.mod h1:NjCQG/D8JandXxM57PZbAJL1DCNL6EypA0vPPwfsc7c= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20231030173426-d783a09b4405/go.mod h1:GRUCuLdzVqZte8+Dl/D4N25yLzcGqqWaYkeVOwulFqw= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20240102182953-50ed04b92917/go.mod h1:O9TvT7A9NLgdqqF0JJXJ+axpaoYiEb8txGmkvy+AvLc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230629202037-9506855d4529/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230731190214-cbb8c96f2d6d/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230803162519-f966b187b2e5/go.mod h1:zBEcrKX2ZOcEkHWxBPAIvYUWOKKMIhYcmNiUIu2ji3I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230920183334-c177e329c48b/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:KSqppvjFjtoCI+KGd4PELB0qLNxdJHRGqRI09mB6pQA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97/go.mod h1:v7nGkzlmW8P3n/bKmWBn2WpBjpOEx8Q6gMueudAmKfY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:4cYg8o5yUbm77w8ZX00LhMVNl/YVBFJRYWDc0uYWMs0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f/go.mod h1:L9KNLi232K1/xB6f7AlSX692koaRnKaWSR0stBki0Yc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231211222908-989df2bf70f3/go.mod h1:eJVxU6o+4G1PSczBr85xmyvSNYAKvAYgkub40YGomFM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917/go.mod h1:xtjpI3tXFPP051KaWnhvxkiubL/6dJ18vLVf7q2pTOU= google.golang.org/genproto/googleapis/rpc v0.0.0-20240304212257-790db918fca8 h1:IR+hp6ypxjH24bkMfEJ0yHR21+gwPWdV+/IBrPQyn3k= google.golang.org/genproto/googleapis/rpc v0.0.0-20240304212257-790db918fca8/go.mod h1:UCOku4NytXMJuLQE5VuqA5lX3PcHCBo8pxNyvkf4xBs= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= @@ -4813,10 +6535,25 @@ google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCD google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= +google.golang.org/grpc v1.52.0/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= +google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= +google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= +google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= +google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +google.golang.org/grpc v1.58.2/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= +google.golang.org/grpc v1.60.0/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= +google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0/go.mod h1:Dk1tviKTvMCz5tvh7t+fh94dhmQVHuCt2OzJB3CTW9Y= google.golang.org/grpc/examples v0.0.0-20220715232852-f601dfac73c9/go.mod h1:gxndsbNG1n4TZcHGgsYEfVGnTxqfEdfiDv6/DADXX9o= +google.golang.org/grpc/examples v0.0.0-20230224211313-3775f633ce20/go.mod h1:Nr5H8+MlGWr5+xX/STzdoEqJrO+YteqFbMyCsrb6mH0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -4832,12 +6569,18 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.29.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= +gopkg.in/alexcesaro/statsd.v2 v2.0.0/go.mod h1:i0ubccKGzBVNBpdGV5MocxyA/XlLUJzA7SLonnE4drU= gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -4851,34 +6594,42 @@ gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/freddierice/go-losetup.v1 v1.0.0-20170407175016-fc9adea44124/go.mod h1:6LXpUYtVsrx91XiupFRJ8jVKOqLZf5PrbEVSGHta/84= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/fsnotify/fsnotify.v1 v1.3.1/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE= gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE= gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/go-jose/go-jose.v2 v2.6.1/go.mod h1:zzZDPkNNw/c9IE7Z9jr11mBZQhKQTMzoEEIoEdZlFBI= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v9 v9.31.0/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE= gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw= gopkg.in/h2non/gock.v1 v1.0.15/go.mod h1:sX4zAkdYX1TRGJ2JY156cFspQn4yRWn6p9EMdODlynE= +gopkg.in/h2non/gock.v1 v1.1.2/go.mod h1:n7UGz/ckNChHiK05rDoiC4MYSunEC/lyaUm2WWaDva0= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/inf.v0 v0.9.0/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= +gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= +gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= +gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= gopkg.in/ldap.v3 v3.0.3/go.mod h1:oxD7NyBuxchC+SgJDE1Q5Od05eGt29SDQVBmV+HYbzw= +gopkg.in/linkedin/goavro.v1 v1.0.5/go.mod h1:Aw5GdAbizjOEl0kAMHV9iHmA8reZzW/OKuJAl4Hb9F0= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/ory-am/dockertest.v3 v3.3.4/go.mod h1:s9mmoLkaGeAh97qygnNj4xWkiN7e1SKekYC6CovU+ek= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/retry.v1 v1.0.3/go.mod h1:FJkXmWiMaAo7xB+xhvDF59zhfjDWyzmyAxiT4dB688g= gopkg.in/robfig/cron.v2 v2.0.0-20150107220207-be2e0b0deed5/go.mod h1:hiOFpYm0ZJbusNj2ywpbrXowU3G8U6GIQzqn2mw1UIE= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.3.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= @@ -4887,9 +6638,14 @@ gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76 gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI= gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/src-d/go-billy.v4 v4.3.0/go.mod h1:tm33zBoOwxjYHZIE+OV8bxTWFMJLrconzFMd38aARFk= +gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= +gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g= +gopkg.in/src-d/go-git.v4 v4.13.1/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8= +gopkg.in/telebot.v3 v3.0.0/go.mod h1:7rExV8/0mDDNu9epSrDm/8j22KLaActH1Tbee6YjzWg= +gopkg.in/telebot.v3 v3.1.2/go.mod h1:GJKwwWqp9nSkIVN51eRKU78aB5f5OnQuWdwiIZfPbko= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= gopkg.in/warnings.v0 v0.1.1/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= @@ -4914,12 +6670,20 @@ gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/postgres v1.3.5/go.mod h1:EGCWefLFQSVFrHGy4J8EtiHCWX5Q8t0yz2Jt9aKkGzU= +gorm.io/gorm v1.23.4/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= +gorm.io/gorm v1.23.5/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gotest.tools/gotestsum v1.9.0/go.mod h1:6JHCiN6TEjA7Kaz23q1bH0e2Dc3YJjDUZ0DmctFZf+w= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -gotest.tools/v3 v3.2.0 h1:I0DwBVMGAx26dttAj1BtJLAkVGncrkkUXfJLC4Flt/I= +gotest.tools/v3 v3.1.0/go.mod h1:fHy7eyTmJFO5bQbUsEGQ1v4m2J3Jz9eWL54TP2/ZuYQ= gotest.tools/v3 v3.2.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= +gotest.tools/v3 v3.3.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= +gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= +gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= +gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= helm.sh/helm/v3 v3.10.3 h1:wL7IUZ7Zyukm5Kz0OUmIFZgKHuAgByCrUcJBtY0kDyw= helm.sh/helm/v3 v3.10.3/go.mod h1:CXOcs02AYvrlPMWARNYNRgf2rNP7gLJQsi/Ubd4EDrI= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -4932,6 +6696,7 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.1.2/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= honnef.co/go/tools v0.3.3/go.mod h1:jzwdWgg7Jdq75wlfblQxO4neNaFFSvgc1tD5Wv8U0Yw= howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= k8s.io/api v0.25.1 h1:yL7du50yc93k17nH/Xe9jujAYrcDkI/i5DL1jPz4E3M= @@ -4956,16 +6721,15 @@ k8s.io/component-helpers v0.25.1/go.mod h1:C0zYGZ5jvaPaXsQCIxkTEQ+HqsPvT3cvAtQY8 k8s.io/controller-manager v0.25.1/go.mod h1:lODg+SLM2nKExI9f8dalbvi+6dYqNkrSUyFZOtj9idg= k8s.io/cri-api v0.25.1/go.mod h1:LFvFRFKuO7cFzrcmLle/cwnuVMgoIZ6bMQ+jrzk24Yc= k8s.io/csi-translation-lib v0.25.1/go.mod h1:LZ/L2ow0Ywt2brUzz/DjB2/ODbr+jEdh7tAS9d73rcI= -k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20190306031000-7a1b7fb0289f/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20190327210449-e17681d19d3a/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20190907103519-ebc107f98eab/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20201203183100-97869a43a9d9/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.1.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/gengo v0.0.0-20220913193501-391367153a38/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20221011193443-fad74ee6edd9/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/klog v0.2.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= @@ -4974,22 +6738,8 @@ k8s.io/klog/v2 v2.70.1 h1:7aaoSdahviPmR+XkS7FyxlkkXs6tHISSG03RxleQAVQ= k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-aggregator v0.25.1/go.mod h1:sIw78EfLuJBA8c0csl+EXY7ni9asm9g18kEYePOW64w= k8s.io/kube-controller-manager v0.25.1/go.mod h1:fFRKgVt7eSlxPnaZBhg7VKU8h2hQGQ8UenfiM2sKum8= -k8s.io/kube-openapi v0.0.0-20180629012420-d83b052f768a/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= -k8s.io/kube-openapi v0.0.0-20180731170545-e3762e86a74c/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= -k8s.io/kube-openapi v0.0.0-20181114233023-0317810137be/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= -k8s.io/kube-openapi v0.0.0-20190228160746-b3a7cee44a30/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= -k8s.io/kube-openapi v0.0.0-20190918143330-0270cf2f1c1d/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= -k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kube-openapi v0.0.0-20210216185858-15cd8face8d6/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kube-openapi v0.0.0-20220124234850-424119656bbf/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/kube-openapi v0.0.0-20220401212409-b28bf2818661/go.mod h1:daOouuuwd9JXpv1L7Y34iV3yf6nxzipkKMWWlqlvK9M= +k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1 h1:MQ8BAZPZlWk3S9K4a9NCkIFQtZShWqoha7snGixVgEA= k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1/go.mod h1:C/N6wCaBHeBHkHUesQOQy2/MZqGgMAFPqGsGQLdbZBU= -k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/kube-openapi v0.0.0-20230515203736-54b630e78af5 h1:azYPdzztXxPSa8wb+hksEKayiz0o+PPisO/d+QhWnoo= -k8s.io/kube-openapi v0.0.0-20230515203736-54b630e78af5/go.mod h1:kzo02I3kQ4BTtEfVLaPbjvCkX97YqGve33wzlb3fofQ= k8s.io/kube-proxy v0.25.1/go.mod h1:upSm57czFM3mntL66s/9XMTnvkO8XADp/hulihMX4n0= k8s.io/kube-scheduler v0.25.1/go.mod h1:FjiqmfOxKruPH30Ul9fSXMuEJ7Nibap3fSDHvFdoLWc= k8s.io/kubectl v0.25.1 h1:M488FUhCMLugm5+kACkDMlldaOz0yLzYpQzUvUP+nDE= @@ -5002,16 +6752,13 @@ k8s.io/metrics v0.25.1/go.mod h1:/t3eughLPd1sQNc47py2vTOY8e1E8bIxecA8rq/qQjM= k8s.io/mount-utils v0.25.1/go.mod h1:WTYq8Ev/JrnkqK2h1jFUnC8qWGuqzMb9XDC+Lu3WNU0= k8s.io/pod-security-admission v0.25.1/go.mod h1:Wq5qUdvu9jVuoGK7qQu+rqO9kIKIT/tgFMHSu3aa5Ro= k8s.io/sample-apiserver v0.25.1/go.mod h1:bN23bmDMrbLP3vGTRhDfR40grAIZL0xx60gh9dIhvcA= -k8s.io/sample-controller v0.25.1/go.mod h1:rlt5cwQbGnD/2C+cqck3+GZUmtTkemP5XXbGaEs0+Xc= k8s.io/system-validators v1.7.0/go.mod h1:gP1Ky+R9wtrSiFbrpEPwWMeYz9yqyy1S/KOh0Vci7WI= k8s.io/test-infra v0.0.0-20181019233642-2e10a0bbe9b3/go.mod h1:2NzXB13Ji0nqpyublHeiPC4FZwU0TknfvyaaNfl/BTA= k8s.io/test-infra v0.0.0-20200115230622-70a5174aa78d/go.mod h1:d8SKryJBXAwfCFVL4wieRez47J2NOOAb9d029sWLseQ= k8s.io/utils v0.0.0-20181019225348-5e321f9a457c/go.mod h1:8k8uAuAQ0rXslZKaEWd0c3oVhZz7sSzSiPnVZayjIX0= -k8s.io/utils v0.0.0-20190308190857-21c4ce38f2a7/go.mod h1:8k8uAuAQ0rXslZKaEWd0c3oVhZz7sSzSiPnVZayjIX0= k8s.io/utils v0.0.0-20190506122338-8fab8cb257d5/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20190809000727-6c36bc71fc4a/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20190923111123-69764acb6e8e/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20191114200735-6ca3b61696b6/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200124190032-861946025e34/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= @@ -5024,26 +6771,89 @@ k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/ k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20221107191617-1a15be271d1d/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= k8s.io/utils v0.0.0-20221128185143-99ec85e7a448/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20230202215443-34013725500c/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20230209194617-a36077c30491/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20230308161112-d77c459e9343/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20230313181309-38a27ef9d749/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20230406110748-d93618cff8a2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20230505201702-9f6742963106/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= k8s.io/utils v0.0.0-20240102154912-e7106e64919e h1:eQ/4ljkx21sObifjzXwlPKpdGLrCfRziVtos3ofG/sQ= k8s.io/utils v0.0.0-20240102154912-e7106e64919e/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +knative.dev/hack v0.0.0-20230712131415-ddae80293c43/go.mod h1:yk2OjGDsbEnQjfxdm0/HJKS2WqTLEFg/N6nUs6Rqx3Q= knative.dev/pkg v0.0.0-20191101194912-56c2594e4f11/go.mod h1:pgODObA1dTyhNoFxPZTTjNWfx6F0aKsKzn+vaT9XO/Q= knative.dev/pkg v0.0.0-20231023150739-56bfe0dd9626 h1:qFE+UDBRg6cpF5LbA0sv1XK4XZ36Z7aTRCa+HcuxnNQ= knative.dev/pkg v0.0.0-20231023150739-56bfe0dd9626/go.mod h1:g+UCgSKQ2f15kHYu/V3CPtoKo5F1x/2Y1ot0NSK7gA0= +kubevirt.io/api v0.0.0-20230620171819-99a8ec929e30/go.mod h1:zts/6mioR8vGgvYmQ17Cb9XsUR9e/WjJcdokmrE38wY= kubevirt.io/api v1.0.0 h1:RBdXP5CDhE0v5qL2OUQdrYyRrHe/F68Z91GWqBDF6nw= kubevirt.io/api v1.0.0/go.mod h1:CJ4vZsaWhVN3jNbyc9y3lIZhw8nUHbWjap0xHABQiqc= kubevirt.io/client-go v0.59.2 h1:FDUqGxLZEQ9PXMZaeVVKZxDIEUE+LV6kUS41Tuza1PU= kubevirt.io/client-go v0.59.2/go.mod h1:wjfT4pndy3YJwBRbYqguuojvd/ZAlkO7rTVD4DwI34M= +kubevirt.io/containerized-data-importer-api v1.55.0/go.mod h1:92HiQEyzPoeMiCbgfG5Qe10JQVbtWMZOXucy56dKdGg= kubevirt.io/containerized-data-importer-api v1.56.1 h1:Ag6LV/HyaO8u7Uix3iaULSeSFfL1lq2zX0MjNkTR6jE= kubevirt.io/containerized-data-importer-api v1.56.1/go.mod h1:92HiQEyzPoeMiCbgfG5Qe10JQVbtWMZOXucy56dKdGg= kubevirt.io/controller-lifecycle-operator-sdk/api v0.0.0-20220329064328-f3cc58c6ed90 h1:QMrd0nKP0BGbnxTqakhDZAUhGKxPiPiN5gSDqKUmGGc= kubevirt.io/controller-lifecycle-operator-sdk/api v0.0.0-20220329064328-f3cc58c6ed90/go.mod h1:018lASpFYBsYN6XwmA2TIrPCx6e0gviTd/ZNtSitKgc= layeh.com/radius v0.0.0-20190322222518-890bc1058917/go.mod h1:fywZKyu//X7iRzaxLgPWsvc0L26IUpVvE/aeIL2JtIQ= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= +modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.37.0/go.mod h1:vtL+3mdHx/wcj3iEGz84rQa8vEqR6XM84v5Lcvfph20= +modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= +modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= +modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= +modernc.org/ccgo/v3 v3.0.0-20220904174949-82d86e1b6d56/go.mod h1:YSXjPL62P2AMSxBphRHPn7IkzhVHqkvOnRKAKh+W6ZI= +modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= +modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= +modernc.org/ccgo/v3 v3.16.13-0.20221017192402-261537637ce8/go.mod h1:fUB3Vn0nVPReA+7IG7yZDfjv1TMWjhQP8gCxrFAtL5g= +modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= +modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= +modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= +modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= +modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= +modernc.org/libc v1.17.4/go.mod h1:WNg2ZH56rDEwdropAJeZPQkXmDwh+JCA1s/htl6r2fA= +modernc.org/libc v1.18.0/go.mod h1:vj6zehR5bfc98ipowQOM2nIDUZnVew/wNC/2tOGS+q0= +modernc.org/libc v1.20.3/go.mod h1:ZRfIaEkgrYgZDl6pa4W39HgN5G/yDW+NRmNKZBDFrk0= +modernc.org/libc v1.21.4/go.mod h1:przBsL5RDOZajTVslkugzLBj1evTue36jEomFQOoYuI= +modernc.org/libc v1.22.2/go.mod h1:uvQavJ1pZ0hIoC/jfqNoMLURIMhKzINIWypNM17puug= modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.3.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.4.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= +modernc.org/sqlite v1.18.2/go.mod h1:kvrTLEWgxUcHa2GfHBQtanR1H9ht3hTJNtKpzH9k1u0= modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= +modernc.org/tcl v1.13.2/go.mod h1:7CLiGIPo1M8Rv1Mitpv5akc2+8fxUd2y2UzC/MfMzy0= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= +modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= mvdan.cc/gofumpt v0.1.1/go.mod h1:yXG1r1WqZVKWbVRtBWKWX9+CxGYfA51nSomhM0woR48= mvdan.cc/gofumpt v0.4.0/go.mod h1:PljLOHDeZqgS8opHRKLzp2It2VBuSdteAgqUfzMTxlQ= mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= @@ -5052,6 +6862,7 @@ mvdan.cc/unparam v0.0.0-20220706161116-678bad134442/go.mod h1:F/Cxw/6mVrNKqrR2Yj mvdan.cc/xurls/v2 v2.0.0/go.mod h1:2/webFPYOXN9jp/lzuj0zuAVlF+9g4KPFJANH1oJhRU= oras.land/oras-go v1.2.0 h1:yoKosVIbsPoFMqAIFHTnrmOuafHal+J/r+I5bdbVWu4= oras.land/oras-go v1.2.0/go.mod h1:pFNs7oHp2dYsYMSS82HaX5l4mpnGO7hbpPN6EWH2ltc= +pgregory.net/rapid v0.3.3/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/letsencrypt v0.0.3/go.mod h1:buyQKZ6IXrRnB7TdkHP0RyEybLx18HHyOSoTyoOLqNY= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= @@ -5060,15 +6871,16 @@ rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.32/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= sigs.k8s.io/cli-utils v0.27.0/go.mod h1:8ll2fyx+bzjbwmwUnKBQU+2LDbMDsxy44DiDZ+drALg= +sigs.k8s.io/cluster-api v0.2.11 h1:sUngHVvh/DyHhERR1fo7eH2N/xS5qfnK7pCtwrErs68= sigs.k8s.io/cluster-api v0.2.11/go.mod h1:BCw+Pqy1sc8mQ/3d2NZM/f5BApKFCMPsnGvKolvDcA0= -sigs.k8s.io/cluster-api v1.1.6 h1:fd0ap613+3YgKjZ28cN6GzPo5czyTcuyGPV4U60RtjA= -sigs.k8s.io/cluster-api v1.1.6/go.mod h1:WBPgw1yJdvybx/U3Ib49T9Q4JurairgnA/s0afxuE/w= sigs.k8s.io/container-object-storage-interface-spec v0.0.0-20220211001052-50e143052de8/go.mod h1:kafkL5l/lTUrZXhVi/9p1GzpEE/ts29BkWkL3Ao33WU= sigs.k8s.io/controller-runtime v0.13.0 h1:iqa5RNciy7ADWnIc8QxCbOX5FEKVR3uxVxKHRMc2WIQ= sigs.k8s.io/controller-runtime v0.13.0/go.mod h1:Zbz+el8Yg31jubvAEyglRZGdLAjplZl+PgtYNI6WNTI= sigs.k8s.io/controller-tools v0.2.4/go.mod h1:m/ztfQNocGYBgTTCmFdnK94uVvgxeZeE3LtJvd/jIzA= +sigs.k8s.io/controller-tools v0.11.3/go.mod h1:qcfX7jfcfYD/b7lAhvqAyTbt/px4GpvN88WKLFFv7p8= sigs.k8s.io/gcp-compute-persistent-disk-csi-driver v0.7.0 h1:mvSbjzrnOd+3AB/7jvz7UNdZs5fhYorhm2H0A2HcIVg= sigs.k8s.io/gcp-compute-persistent-disk-csi-driver v0.7.0/go.mod h1:aSyCjg9bNQQxY9hnnNo10vjhZsQTkLliruvRXp3N9B4= +sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs= sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= @@ -5082,7 +6894,6 @@ sigs.k8s.io/kustomize/kyaml v0.13.9 h1:Qz53EAaFFANyNgyOEJbT/yoIHygK40/ZcvU3rgry2 sigs.k8s.io/kustomize/kyaml v0.13.9/go.mod h1:QsRbD0/KcU+wdk0/L0fIp2KLnohkVzs6fQ85/nOXac4= sigs.k8s.io/sig-storage-lib-external-provisioner/v6 v6.3.0 h1:IKsKAnscMyIOqyl8s8V7guTcx0QBEa6OT57EPgAgpmM= sigs.k8s.io/sig-storage-lib-external-provisioner/v6 v6.3.0/go.mod h1:DhZ52sQMJHW21+JXyA2LRUPRIxKnrNrwh+QFV+2tVA4= -sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= diff --git a/pkg/pureutils/pure_types.go b/pkg/pureutils/pure_types.go index 520ffac8e..366766a11 100644 --- a/pkg/pureutils/pure_types.go +++ b/pkg/pureutils/pure_types.go @@ -18,9 +18,11 @@ import ( ) const ( - PureSecretName = "px-pure-secret" - PureS3SecretName = "px-pure-secret-fbs3" - PureJSONKey = "pure.json" + PureSecretName = "px-pure-secret" + PureS3SecretName = "px-pure-secret-fbs3" + PureJSONKey = "pure.json" + NonPxPureSecretName = "px-non-pure-secret" + nonPxPureJsonKey = "non-pure.json" PureSecretArrayZoneLabel = "topology.portworx.io/zone" @@ -76,6 +78,12 @@ func (p *PXPureSecret) GetArrayToZoneMap() map[string]string { return arrayEndpointToZoneMap } +func GetNonPxPureSecret(namespace string) (PXPureSecret, error) { + conf := PXPureSecret{} + err := GetFAPureSecret(&conf, NonPxPureSecretName, namespace) + return conf, err +} + func GetPXPureSecret(namespace string) (PXPureSecret, error) { conf := PXPureSecret{} err := GetPureSecret(&conf, PureSecretName, namespace) @@ -88,6 +96,27 @@ func GetS3Secret(namespace string) (PXPureS3Secret, error) { return conf, err } +func GetFAPureSecret(output interface{}, name, namespace string) error { + secret, err := core.Instance().GetSecret(name, namespace) + if err != nil { + return fmt.Errorf("failed to retrieve secret '%s' from namespace '%s': %v", name, namespace, err) + } + + var pureConnectionJSON []byte + var ok bool + + if pureConnectionJSON, ok = secret.Data[nonPxPureJsonKey]; !ok { + return fmt.Errorf("secret '%s' is missing field '%s'", name, nonPxPureJsonKey) + } + + err = json.Unmarshal(pureConnectionJSON, output) + if err != nil { + return fmt.Errorf("error unmarshaling pure config file from secret '%s': %v", name, err) + } + + return nil +} + func GetPureSecret(output interface{}, name, namespace string) error { secret, err := core.Instance().GetSecret(name, namespace) if err != nil { diff --git a/pkg/pureutils/purefa.go b/pkg/pureutils/purefa.go index aad9de8f8..8e8cb9d2a 100644 --- a/pkg/pureutils/purefa.go +++ b/pkg/pureutils/purefa.go @@ -94,6 +94,20 @@ func ListAllTheVolumesFromSpecificFA(faClient *flasharray.Client) ([]flasharray. return volumes, nil } +// Verifies if Volumes +func IsFAVolumeExists(faClient *flasharray.Client, volumeName string) (bool, error) { + allVolumes, err := ListAllTheVolumesFromSpecificFA(faClient) + if err != nil { + return false, err + } + for _, eachVol := range allVolumes { + if strings.Contains(eachVol.Name, volumeName) { + return true, nil + } + } + return false, nil +} + // GetAllHostGroups Get all Available Host Groups from array func GetAllHostGroups(faClient *flasharray.Client) ([]flasharray.Hostgroup, error) { hostGroup, err := faClient.Hostgroups.ListHostgroups(nil) @@ -134,6 +148,24 @@ func CreateNewHostOnFA(faClient *flasharray.Client, hostName string) (*flasharra return host, nil } +// ListVolumesFromHosts returns list of Volumes +func ListVolumesFromHosts(faClient *flasharray.Client) (map[string][]flasharray.ConnectedVolume, error) { + allHostVolumes := make(map[string][]flasharray.ConnectedVolume) + allHosts, err := ListAllHosts(faClient) + if err != nil { + return nil, err + } + + for _, eachHost := range allHosts { + hostVolumes, err := faClient.Hosts.ListHostConnections(eachHost.Name, nil) + if err != nil { + return nil, err + } + allHostVolumes[eachHost.Name] = hostVolumes + } + return allHostVolumes, nil +} + // ConnectVolumeToHost Connects Volume to Host func ConnectVolumeToHost(faClient *flasharray.Client, hostName string, volName string) (*flasharray.ConnectedVolume, error) { connectedVol, err := faClient.Hosts.ConnectHost(hostName, volName, nil) @@ -143,6 +175,39 @@ func ConnectVolumeToHost(faClient *flasharray.Client, hostName string, volName s return connectedVol, nil } +// DisConnectVolumeFromHost Disconnects Volume from Host +func DisConnectVolumeFromHost(faClient *flasharray.Client, hostName string, volName string) (*flasharray.ConnectedVolume, error) { + connectedVol, err := faClient.Hosts.DisconnectHost(hostName, volName) + if err != nil { + return nil, err + } + return connectedVol, nil +} + +// DeleteVolumeOnFABackend Deletes Volume on FA Backend +func DeleteVolumeOnFABackend(faClient *flasharray.Client, volName string) (*flasharray.Volume, error) { + volume, err := faClient.Volumes.DeleteVolume(volName) + if err != nil { + return nil, err + } + + // Delete from Recycle Bin + _, err = faClient.Volumes.EradicateVolume(volName) + if err != nil { + return nil, err + } + return volume, nil +} + +// DeleteHostOnFA Deletes Host on FA +func DeleteHostOnFA(faClient *flasharray.Client, hostName string) (*flasharray.Host, error) { + host, err := faClient.Hosts.DeleteHost(hostName) + if err != nil { + return nil, err + } + return host, nil +} + // UpdateIQNOnSpecificHosts Updates IQN on specific hosts func UpdateIQNOnSpecificHosts(faClient *flasharray.Client, hostName string, iqnValue string) (*flasharray.Host, error) { data1 := make(map[string][]string) @@ -234,11 +299,15 @@ func IsNetworkInterfaceEnabled(faClient *flasharray.Client, iface string) (bool, // EnableNetworkInterface enables network interface func EnableNetworkInterface(faClient *flasharray.Client, iface string) (bool, error) { - interfaces, err := faClient.Networks.EnableNetworkInterface(iface) + _, err := faClient.Networks.EnableNetworkInterface(iface) + if err != nil { + return false, err + } + isEnabled, err := IsNetworkInterfaceEnabled(faClient, iface) if err != nil { return false, err } - if interfaces.Enabled { + if isEnabled { return true, nil } return false, fmt.Errorf("Failed to enable network interface [%v]", iface) @@ -246,12 +315,32 @@ func EnableNetworkInterface(faClient *flasharray.Client, iface string) (bool, er // DisableNetworkInterface disabled network interface func DisableNetworkInterface(faClient *flasharray.Client, iface string) (bool, error) { - interfaces, err := faClient.Networks.DisableNetworkInterface(iface) + _, err := faClient.Networks.DisableNetworkInterface(iface) if err != nil { return false, err } - if !interfaces.Enabled { + isEnabled, err := IsNetworkInterfaceEnabled(faClient, iface) + if err != nil { + return false, err + } + if !isEnabled { return true, nil } return false, fmt.Errorf("Failed to disable network interface [%v]", iface) } + +// GetHostFromIqn returns host name from iqn +func GetHostFromIqn(faClient *flasharray.Client, iqn string) (*flasharray.Host, error) { + hosts, err := ListAllHosts(faClient) + if err != nil { + return &flasharray.Host{}, err + } + for _, eachHost := range hosts { + for _, eachIqn := range eachHost.Iqn { + if eachIqn == iqn { + return &eachHost, nil + } + } + } + return &flasharray.Host{}, fmt.Errorf("Failed to get host name from iqn [%v]", iqn) +} diff --git a/pkg/pureutils/purefa_rest2x.go b/pkg/pureutils/purefa_rest2x.go new file mode 100644 index 000000000..06a1eefa4 --- /dev/null +++ b/pkg/pureutils/purefa_rest2x.go @@ -0,0 +1,41 @@ +package pureutils + +import ( + "github.com/portworx/torpedo/drivers/pure/flasharray" +) + +const ( + RestAPI = "2.4" +) + +// PureCreateClientAndConnect Create FA Client and Connect +func PureCreateClientAndConnectRest226(faMgmtEndpoint string, apiToken string) (*flasharray.Client, error) { + faClient, err := flasharray.NewClient(faMgmtEndpoint, apiToken, "", "", + RestAPI, false, false, "", nil) + if err != nil { + return nil, err + } + return faClient, nil +} + +// ListAllVolumesFromFA returns list of all Available Volumes present in FA (Function should be used with RestAPI 2.x) +func ListAllVolumesFromFA(faClient *flasharray.Client) ([]flasharray.VolResponse, error) { + params := make(map[string]string) + params["destroyed"] = "false" + volumes, err := faClient.Volumes.ListAllAvailableVolumes(params, nil) + if err != nil { + return nil, err + } + return volumes, nil +} + +// ListAllDestroyedVolumesFromFA Returns list of all Destroyed FA Volumes (Function should be used with RestAPI 2.x) +func ListAllDestroyedVolumesFromFA(faClient *flasharray.Client) ([]flasharray.VolResponse, error) { + params := make(map[string]string) + params["destroyed"] = "true" + volumes, err := faClient.Volumes.ListAllAvailableVolumes(params, nil) + if err != nil { + return nil, err + } + return volumes, nil +} diff --git a/pkg/pureutils/purefb.go b/pkg/pureutils/purefb.go index 1bb931f2c..f3a4b0fa9 100644 --- a/pkg/pureutils/purefb.go +++ b/pkg/pureutils/purefb.go @@ -19,7 +19,7 @@ func PureCreateFbClientAndConnect(fbMgmtEndpoint string, apiToken string) (*flas // GetFAMgmtEndPoints , Get Lists of all management Endpoints from FB Secrets func GetFBMgmtEndPoints(secret PXPureSecret) []string { mgmtEndpoints := []string{} - for _, fbDetails := range secret.Arrays { + for _, fbDetails := range secret.Blades { mgmtEndpoints = append(mgmtEndpoints, fbDetails.MgmtEndPoint) } return mgmtEndpoints diff --git a/pkg/storkctlcli/storkctlcli.go b/pkg/storkctlcli/storkctlcli.go new file mode 100644 index 000000000..25e4d302d --- /dev/null +++ b/pkg/storkctlcli/storkctlcli.go @@ -0,0 +1,135 @@ +package storkctlcli + +import ( + "bytes" + "fmt" + "os" + "time" + + storkv1 "github.com/libopenstorage/stork/pkg/apis/stork/v1alpha1" + "github.com/libopenstorage/stork/pkg/storkctl" + storkops "github.com/portworx/sched-ops/k8s/stork" + "github.com/portworx/sched-ops/task" + "github.com/sirupsen/logrus" + + "github.com/portworx/torpedo/pkg/aetosutil" +) + +var dash *aetosutil.Dashboard + +const ( + drPrefix = "automation-" + actionRetryTimeout = 10 * time.Minute + actionRetryInterval = 10 * time.Second +) + +var ( + migSchedNs = "kube-system" +) + +func ScheduleStorkctlMigrationSched(schedName, clusterPair, namespace string, extraArgs map[string]string) error { + if namespace != "" { + migSchedNs = namespace + } + cmdArgs := map[string]string{ + "cluster-pair": clusterPair, + "namespace": migSchedNs, + } + err := createMigrationScheduleCli(schedName, cmdArgs, extraArgs) + return err +} + +func createMigrationScheduleCli(schedName string, cmdArgs map[string]string, extraArgs map[string]string) error { + factory := storkctl.NewFactory() + var outputBuffer bytes.Buffer + cmd := storkctl.NewCommand(factory, os.Stdin, &outputBuffer, os.Stderr) + migCmdArgs := []string{"create", "migrationschedule", schedName} + // add the custom args to the command + for key, value := range cmdArgs { + migCmdArgs = append(migCmdArgs, "--"+key) + if value != "" { + migCmdArgs = append(migCmdArgs, value) + } + } + if extraArgs != nil { + for key, value := range extraArgs { + migCmdArgs = append(migCmdArgs, "--"+key) + if value != "" { + migCmdArgs = append(migCmdArgs, value) + } + } + } + cmd.SetArgs(migCmdArgs) + // execute the command + logrus.Infof("The storkctl command being executed is %v", migCmdArgs) + if err := cmd.Execute(); err != nil { + if err != nil { + return fmt.Errorf("Error in executing create migration schedule command: %v", err) + } + } + return nil +} + +func PerformFailoverOrFailback(action, namespace, migSchdRef string, skipSourceOp bool, extraArgs map[string]string) (error, string) { + failoverFailbackCmdArgs := []string{"perform", action, "--migration-reference", migSchdRef, "--namespace", migSchedNs} + if namespace != "" { + migSchedNs = namespace + } + + factory := storkctl.NewFactory() + var outputBuffer bytes.Buffer + cmd := storkctl.NewCommand(factory, os.Stdin, &outputBuffer, os.Stderr) + if skipSourceOp && action == "failover" { + failoverFailbackCmdArgs = append(failoverFailbackCmdArgs, "--skip-source-operations") + } + if extraArgs != nil { + for key, value := range extraArgs { + failoverFailbackCmdArgs = append(failoverFailbackCmdArgs, "--"+key) + if value != "" { + failoverFailbackCmdArgs = append(failoverFailbackCmdArgs, value) + } + } + } + cmd.SetArgs(failoverFailbackCmdArgs) + // execute the command + logrus.Infof("The storkctl command being executed is %v", failoverFailbackCmdArgs) + if err := cmd.Execute(); err != nil { + if err != nil { + return fmt.Errorf("Error in executing perform %v command: %v", action, err), "" + } + } + // Get the captured output as a string + actualOutput := outputBuffer.String() + logrus.Infof("Actual output is: %s", actualOutput) + return nil, actualOutput +} + +func GetDRActionStatus(actionName, actionNamespace string) (string, string, error) { + var action *storkv1.Action + action, err := storkops.Instance().GetAction(actionName, actionNamespace) + if err != nil { + return "", "", err + } + return string(action.Status.Status), string(action.Status.Stage), nil +} + +// WaitForMigration - waits until all migrations in the given list are successful +func WaitForActionSuccessful(actionName string, actionNamespace string, timeoutScale int) error { + checkMigrations := func() (interface{}, bool, error) { + isComplete := true + status, stage, err := GetDRActionStatus(actionName, actionNamespace) + if err != nil { + return "", false, err + } + if status != "Successful" || stage != "Final" { + isComplete = false + } + if isComplete { + return "", false, nil + } + return "", true, fmt.Errorf("Action status is %v waiting for successful status", status) + } + actionTimeout := actionRetryTimeout * time.Duration(timeoutScale) + _, err := task.DoRetryWithTimeout(checkMigrations, actionTimeout, actionRetryInterval) + return err +} diff --git a/tests/backup/backup_basic_test.go b/tests/backup/backup_basic_test.go index e5c2ee8ef..8e5fe1deb 100644 --- a/tests/backup/backup_basic_test.go +++ b/tests/backup/backup_basic_test.go @@ -80,13 +80,23 @@ func BackupInitInstance() { var commitID string log.Infof("Inside BackupInitInstance") err = Inst().S.Init(scheduler.InitOptions{ - SpecDir: Inst().SpecDir, - VolDriverName: Inst().V.String(), - StorageProvisioner: Inst().Provisioner, - NodeDriverName: Inst().N.String(), - CustomAppConfig: Inst().CustomAppConfig, + SpecDir: Inst().SpecDir, + VolDriverName: Inst().V.String(), + StorageProvisioner: Inst().Provisioner, + NodeDriverName: Inst().N.String(), + CustomAppConfig: Inst().CustomAppConfig, + SecretConfigMapName: Inst().ConfigMap, + SecureApps: Inst().SecureAppList, }) log.FailOnError(err, "Error occurred while Scheduler Driver Initialization") + if Inst().ConfigMap != "" { + log.Infof("Using Config Map: %s ", Inst().ConfigMap) + token, err = Inst().S.GetTokenFromConfigMap(Inst().ConfigMap) + log.FailOnError(err, "Error occured while getting token from config map") + log.Infof("Token used for initializing: %s ", token) + } else { + token = "" + } err = Inst().N.Init(node.InitOptions{ SpecDir: Inst().SpecDir, }) @@ -235,6 +245,11 @@ var _ = BeforeSuite(func() { dash.VerifyFatal(err, nil, fmt.Sprintf("Verifying updation of ownership for Global Post-rule of application")) } } + pxBackupNamespace, err := backup.GetPxBackupNamespace() + log.FailOnError(err, "failed to get Px-Backup namespace") + PvcListBeforeRun, err = GetPVCListForNamespace(pxBackupNamespace) + log.FailOnError(err, "failed to list PVCs before run") + log.Infof("PVC list before the run is [%s]", PvcListBeforeRun) }) var _ = AfterSuite(func() { @@ -417,6 +432,20 @@ var _ = AfterSuite(func() { log.Infof("Group %s was not deleted", group.Name) } } + + // Fetch PVC list for Px-Backup namespace + pxBackupNamespace, err := backup.GetPxBackupNamespace() + log.FailOnError(err, "failed to get Px-Backup namespace") + PvcListAfterRun, err = GetPVCListForNamespace(pxBackupNamespace) + log.FailOnError(err, "failed to list PVCs after run") + log.Infof("PVC list after the run is [%s]", PvcListAfterRun) + + //TO DO: Uncomment the below part after fixing ValidatePVCCleanup + // Verify PVC Cleanup on PX-Backup namespace + //if err := ValidatePVCCleanup(PvcListBeforeRun, PvcListAfterRun); err != nil { + // log.FailOnError(err, "PVC cleanup validation failed") + //} + //fmt.Println("PVC cleanup validation passed.") } }) diff --git a/tests/backup/backup_kubevirt_test.go b/tests/backup/backup_kubevirt_test.go index 20c555051..e04567abf 100644 --- a/tests/backup/backup_kubevirt_test.go +++ b/tests/backup/backup_kubevirt_test.go @@ -3438,9 +3438,17 @@ var _ = Describe("{KubevirtVMMigrationTest}", Label(TestCaseLabelsMap[KubevirtVM dash.VerifyFatal(err, nil, fmt.Sprintf("Verfiying VM [%s] is up and running after rebooting the node [%s]", vm.Name, nodeName)) log.Infof("Validating all px-backup pods are ready after reboot") err = ValidateAllPodsInPxBackupNamespace() - dash.VerifyFatal(err, nil, "px-backup pods verification successful") - //Adding a sleep of 2 minute, Sometimes, it takes time for the pod to become ready. - time.Sleep(120 * time.Second) + dash.VerifyFatal(err, nil, "verifing px-backups pods are in running state after reboot") + t := func() (interface{}, bool, error) { + PxBackupVersion, err := GetPxBackupVersionString() + if err != nil { + return nil, true, fmt.Errorf("failed to get px-backup version string , error [%s]", err.Error()) + } + log.Infof(fmt.Sprintf("fetched px-backup version %s", PxBackupVersion)) + return nil, false, nil + } + _, err = task.DoRetryWithTimeout(t, 30*time.Minute, 30*time.Second) + dash.VerifyFatal(err, nil, "verifing px-backup version after reboot") log.Infof("Taking backup of VMs after node reboot") wg.Add(1) backupName := fmt.Sprintf("%s-%s-%v", "post-reboot-backup", scheduledNamespace, time.Now().Unix()) diff --git a/tests/backup/backup_portworx_test.go b/tests/backup/backup_portworx_test.go index 9d24d981c..e6f918779 100644 --- a/tests/backup/backup_portworx_test.go +++ b/tests/backup/backup_portworx_test.go @@ -630,6 +630,8 @@ var _ = Describe("{RestoreEncryptedAndNonEncryptedBackups}", Label(TestCaseLabel log.FailOnError(err, "Fetching px-central-admin ctx") err = ValidateBackupLocation(ctx, BackupOrgID, backupLocationNames[1], BackupLocation1UID) log.FailOnError(err, "backup location %s validation failed", backupLocationNames[1]) + err = WaitForBackupLocationAddition(ctx, backupLocationNames[1], BackupLocation1UID, BackupOrgID, BackupLocationValidationTimeout, BackupLocationValidationRetryTime) + dash.VerifyFatal(err, nil, fmt.Sprintf("Validation of backup location [%s]", backupLocationNames[1])) }) Step("Restore the encrypted backups after validating the encrypted backup location", func() { diff --git a/tests/backup/backup_resiliency_test.go b/tests/backup/backup_resiliency_test.go index 806dd378c..292ff83ed 100644 --- a/tests/backup/backup_resiliency_test.go +++ b/tests/backup/backup_resiliency_test.go @@ -949,21 +949,22 @@ var _ = Describe("{ScaleMongoDBWhileBackupAndRestore}", Label(TestCaseLabelsMap[ dash.VerifyFatal(err, nil, "Scaling backup MongoDB statefulset replica to original count") log.Infof("mongodb replica after scaling back to original replica is %v", *statefulSet.Spec.Replicas) dash.VerifyFatal(*statefulSet.Spec.Replicas == originalReplicaCount, true, "Verify mongodb statefulset replica after scaling back to original") - log.Infof("Verify that at least one mongodb pod is in Ready state") + log.Infof("Verify that at least two mongodb pod is in Ready state") mongoDBPodStatus := func() (interface{}, bool, error) { statefulSet, err = apps.Instance().GetStatefulSet(MongodbStatefulset, pxBackupNS) if err != nil { return "", true, err } if statefulSet.Status.ReadyReplicas < 2 { - return "", true, fmt.Errorf("no mongodb pods are ready yet") + log.Infof("Number of mongodb pods in Ready state: %v", statefulSet.Status.ReadyReplicas) + return "", true, fmt.Errorf("minimum 2 mongodb pods are not ready yet") } return "", false, nil } _, err = DoRetryWithTimeoutWithGinkgoRecover(mongoDBPodStatus, PodStatusTimeOut, PodStatusRetryTime) log.FailOnError(err, "Verify status of mongodb pod") log.Infof("Number of mongodb pods in Ready state are %v", statefulSet.Status.ReadyReplicas) - dash.VerifyFatal(statefulSet.Status.ReadyReplicas > 1, true, "Verifying that at least one mongodb pod is in Ready state") + dash.VerifyFatal(statefulSet.Status.ReadyReplicas >= 2, true, "Verifying that at least two mongodb pods are in Ready state") }) Step("Check if backup is successful after MongoDB statefulset is scaled back to original replica", func() { log.InfoD("Check if backup is successful after MongoDB statefulset is scaled back to original replica") @@ -1018,21 +1019,22 @@ var _ = Describe("{ScaleMongoDBWhileBackupAndRestore}", Label(TestCaseLabelsMap[ dash.VerifyFatal(err, nil, "Scaling back MongoDB statefulset replica to original count") log.Infof("mongodb replica after scaling back to original replica is %v", *statefulSet.Spec.Replicas) dash.VerifyFatal(*statefulSet.Spec.Replicas == originalReplicaCount, true, "Verify mongodb statefulset replica after scaling back to original") - log.Infof("Verify that at least one mongodb pod is in Ready state") + log.Infof("Verify that at least two mongodb pod is in Ready state") mongoDBPodStatus := func() (interface{}, bool, error) { statefulSet, err = apps.Instance().GetStatefulSet(MongodbStatefulset, pxBackupNS) if err != nil { return "", true, err } - if statefulSet.Status.ReadyReplicas < 1 { - return "", true, fmt.Errorf("no mongodb pods are ready yet") + if statefulSet.Status.ReadyReplicas < 2 { + log.Infof("Number of mongodb pods in Ready state: %v", statefulSet.Status.ReadyReplicas) + return "", true, fmt.Errorf("minimum 2 mongodb pods are not ready yet") } return "", false, nil } _, err = DoRetryWithTimeoutWithGinkgoRecover(mongoDBPodStatus, PodStatusTimeOut, PodStatusRetryTime) log.FailOnError(err, "Verify status of mongodb pod") log.Infof("Number of mongodb pods in Ready state are %v", statefulSet.Status.ReadyReplicas) - dash.VerifyFatal(statefulSet.Status.ReadyReplicas > 0, true, "Verifying that at least one mongodb pod is in Ready state") + dash.VerifyFatal(statefulSet.Status.ReadyReplicas >= 2, true, "Verifying that at least two mongodb pods are in Ready state") }) Step("Check if restore is successful after MongoDB statefulset is scaled back to original replica", func() { log.InfoD("Check if restore is successful after MongoDB statefulset is scaled back to original replica") diff --git a/tests/backup/backup_share_test.go b/tests/backup/backup_share_test.go index 627d574dc..a8bfa5d14 100644 --- a/tests/backup/backup_share_test.go +++ b/tests/backup/backup_share_test.go @@ -3872,7 +3872,7 @@ var _ = Describe("{IssueMultipleDeletesForSharedBackup}", Label(TestCaseLabelsMa backupMap[backupName] = backupUID // Start Restore - namespaceMapping[bkpNamespaces[0]] = bkpNamespaces[0] + "restored" + namespaceMapping[bkpNamespaces[0]] = bkpNamespaces[0] + "-" + user restoreName := fmt.Sprintf("%s-%s", RestoreNamePrefix, user) restoreNames = append(restoreNames, restoreName) log.Infof("Creating restore %s for user %s", restoreName, user) diff --git a/tests/backup/backup_upgrade_test.go b/tests/backup/backup_upgrade_test.go index 0d4ffc6d9..f185f7868 100644 --- a/tests/backup/backup_upgrade_test.go +++ b/tests/backup/backup_upgrade_test.go @@ -1118,14 +1118,14 @@ var _ = Describe("{PXBackupClusterUpgradeTest}", Label(TestCaseLabelsMap[PXBacku err = Inst().S.UpgradeScheduler(version) dash.VerifyFatal(err, nil, fmt.Sprintf("verify [%s] upgrade to [%s] is successful", Inst().S.String(), version)) - PrintK8sCluterInfo() + PrintK8sClusterInfo() err = SwitchBothKubeConfigANDContext("destination") dash.VerifyFatal(err, nil, "Switching context and Kubeconfig to destination cluster") err = Inst().S.UpgradeScheduler(version) dash.VerifyFatal(err, nil, fmt.Sprintf("verify [%s] upgrade to [%s] is successful", Inst().S.String(), version)) - PrintK8sCluterInfo() + PrintK8sClusterInfo() err = SwitchBothKubeConfigANDContext("source") dash.VerifyFatal(err, nil, "Switching context and kubeconfig to source cluster") @@ -1156,7 +1156,7 @@ var _ = Describe("{PXBackupClusterUpgradeTest}", Label(TestCaseLabelsMap[PXBacku dash.VerifyFatal(err, nil, fmt.Sprintf("verify volume driver after upgrade to %s", version)) // Printing cluster node info after the upgrade - PrintK8sCluterInfo() + PrintK8sClusterInfo() err = SwitchBothKubeConfigANDContext("destination") dash.VerifyFatal(err, nil, "Switching context and Kubeconfig to destination cluster") @@ -1176,7 +1176,7 @@ var _ = Describe("{PXBackupClusterUpgradeTest}", Label(TestCaseLabelsMap[PXBacku dash.VerifyFatal(err, nil, fmt.Sprintf("verify volume driver after upgrade to %s", version)) // Printing cluster node info after the upgrade - PrintK8sCluterInfo() + PrintK8sClusterInfo() err = SwitchBothKubeConfigANDContext("source") dash.VerifyFatal(err, nil, "Switching context and kubeconfig to source cluster") diff --git a/tests/backup_helper.go b/tests/backup_helper.go index ee0b91230..a1365c290 100644 --- a/tests/backup_helper.go +++ b/tests/backup_helper.go @@ -1,6 +1,7 @@ package tests import ( + "bytes" context1 "context" "fmt" "io/ioutil" @@ -15,6 +16,7 @@ import ( "strconv" "strings" "sync" + "text/template" "time" "k8s.io/apimachinery/pkg/api/resource" @@ -145,7 +147,7 @@ const ( fullMaintenancePod = "full-maintenance-repo" jobDeleteTimeout = 5 * time.Minute jobDeleteRetryTime = 10 * time.Second - PodStatusTimeOut = 20 * time.Minute + PodStatusTimeOut = 30 * time.Minute PodStatusRetryTime = 30 * time.Second licenseCountUpdateTimeout = 15 * time.Minute licenseCountUpdateRetryTime = 1 * time.Minute @@ -171,6 +173,8 @@ const ( storkControllerConfigMap = "stork-controller-config" storkControllerConfigMapUpdateTimeout = 15 * time.Minute storkControllerConfigMapRetry = 30 * time.Second + BackupLocationValidationTimeout = 10 * time.Minute + BackupLocationValidationRetryTime = 30 * time.Second ) var ( @@ -204,6 +208,8 @@ var ( NfsRestoreExecutorPodLabel = map[string]string{"kdmp.portworx.com/driver-name": "nfsrestore"} queryCountForValidation = 10 IsBackupLongevityRun = false + PvcListBeforeRun []string + PvcListAfterRun []string ) type UserRoleAccess struct { @@ -2074,10 +2080,10 @@ func CreateUsers(numberOfUsers int) []string { log.InfoD("Creating %d users", numberOfUsers) var wg sync.WaitGroup for i := 1; i <= numberOfUsers; i++ { - userName := fmt.Sprintf("testuser%v-%v", i, time.Now().Unix()) - firstName := fmt.Sprintf("FirstName%v", i) - lastName := fmt.Sprintf("LastName%v", i) - email := fmt.Sprintf("%v@cnbu.com", userName) + userName := fmt.Sprintf("tp-user%d-%s", i, RandomString(4)) + firstName := fmt.Sprintf("FirstName%d", i) + lastName := fmt.Sprintf("LastName%d", i) + email := fmt.Sprintf("%s@cnbu.com", userName) wg.Add(1) go func(userName, firstName, lastName, email string) { defer GinkgoRecover() @@ -2168,7 +2174,7 @@ func CleanupCloudSettingsAndClusters(backupLocationMap map[string]string, credNa log.Warnf("the cloud credential ref of the cluster [%s] is nil", clusterObj.GetName()) } } - err = DeleteClusterWithUID(clusterObj.GetName(), clusterObj.GetUid(), BackupOrgID, ctx, false) + err = DeleteClusterWithUID(clusterObj.GetName(), clusterObj.GetUid(), BackupOrgID, ctx, true) Inst().Dash.VerifySafely(err, nil, fmt.Sprintf("Deleting cluster %s", clusterObj.GetName())) if clusterCredName != "" { err = DeleteCloudCredential(clusterCredName, BackupOrgID, clusterCredUID) @@ -3929,8 +3935,74 @@ func PxBackupUpgrade(versionToUpgrade string) error { // Execute helm upgrade using cmd log.Infof("Upgrading Px-Backup version from %s to %s", currentBackupVersionString, versionToUpgrade) - cmd = fmt.Sprintf("helm upgrade px-central px-central-%s.tgz --namespace %s --version %s --set persistentStorage.enabled=true,persistentStorage.storageClassName=\"%s\",pxbackup.enabled=true", - versionToUpgrade, pxBackupNamespace, versionToUpgrade, *storageClassName) + customRegistry := os.Getenv("CUSTOM_REGISTRY") + customRepo := os.Getenv("CUSTOM_REPO") + if customRegistry == "" || customRepo == "" { + cmd = fmt.Sprintf("helm upgrade px-central px-central-%s.tgz --namespace %s --version %s --set persistentStorage.enabled=true,persistentStorage.storageClassName=\"%s\",pxbackup.enabled=true", + versionToUpgrade, pxBackupNamespace, versionToUpgrade, *storageClassName) + } else { + cmd = fmt.Sprintf("helm upgrade px-central px-central-%s.tgz --namespace %s --version %s --set persistentStorage.enabled=true,persistentStorage.storageClassName=\"%s\",pxbackup.enabled=true", + versionToUpgrade, pxBackupNamespace, versionToUpgrade, *storageClassName) + + // Additional settings to be appended using template + tmpl := `,{{range .Images}}images.{{.Name}}.repo="{{$.CustomRepo}}",images.{{.Name}}.registry="{{$.CustomRegistry}}",{{end}}` + + // Define the template + t, err := template.New("cmd").Parse(tmpl) + if err != nil { + return err + } + + // Data for the template + data := struct { + CustomRegistry string + CustomRepo string + Images []struct{ Name string } + }{ + CustomRegistry: customRegistry, + CustomRepo: customRepo, + Images: []struct{ Name string }{ + {Name: "pxcentralApiServerImage"}, + {Name: "pxcentralFrontendImage"}, + {Name: "pxcentralBackendImage"}, + {Name: "pxcentralMiddlewareImage"}, + {Name: "postInstallSetupImage"}, + {Name: "keycloakBackendImage"}, + {Name: "keycloakFrontendImage"}, + {Name: "keycloakLoginThemeImage"}, + {Name: "keycloakInitContainerImage"}, + {Name: "mysqlImage"}, + {Name: "pxBackupImage"}, + {Name: "mongodbImage"}, + {Name: "licenseServerImage"}, + {Name: "cortexImage"}, + {Name: "cassandraImage"}, + {Name: "proxyConfigImage"}, + {Name: "consulImage"}, + {Name: "dnsmasqImage"}, + {Name: "grafanaImage"}, + {Name: "prometheusImage"}, + {Name: "prometheusConfigReloadrImage"}, + {Name: "prometheusOperatorImage"}, + {Name: "memcachedMetricsImage"}, + {Name: "memcachedIndexImage"}, + {Name: "memcachedImage"}, + {Name: "pxBackupPrometheusImage"}, + {Name: "pxBackupAlertmanagerImage"}, + {Name: "pxBackupPrometheusOperatorImage"}, + {Name: "pxBackupPrometheusConfigReloaderImage"}, + }, + } + + // Execute the template and append the result to the existing command + var buf bytes.Buffer + if err := t.Execute(&buf, data); err != nil { + return err + } + + // Append the dynamically generated settings to the initial command + cmd += buf.String() + } log.Infof("helm command: %v ", cmd) pxBackupUpgradeStartTime := time.Now() @@ -8632,3 +8704,51 @@ func GetUpdatedKubeVirtVMSpecForBackup(scheduledAppContextsToBackup []*scheduler } return nil } + +// GetPVCListForNamespace retrieves the list of PVCs in the specified namespace. +func GetPVCListForNamespace(namespace string) ([]string, error) { + k8sCore := core.Instance() + pvcList, err := k8sCore.GetPersistentVolumeClaims(namespace, make(map[string]string)) + if err != nil { + return nil, fmt.Errorf("failed to get PVCs in namespace %s: %w", namespace, err) + } + // Extract PVC names from the list + var pvcNameList []string + for _, pvc := range pvcList.Items { + pvcNameList = append(pvcNameList, pvc.Name) + } + return pvcNameList, nil +} + +// ValidatePVCCleanup checks if there is a mismatch between the original PVC list and the current one. +func ValidatePVCCleanup(pvcBefore, pvcAfter []string) error { + pvcBeforeSet := make(map[string]bool) + pvcAfterSet := make(map[string]bool) + + // Populate sets for PVC names before and after the run + for _, pvc := range pvcBefore { + pvcBeforeSet[pvc] = true + } + + for _, pvc := range pvcAfter { + pvcAfterSet[pvc] = true + } + + // Check for missing PVCs after the run + for pvc := range pvcBeforeSet { + if !pvcAfterSet[pvc] { + fmt.Printf("PVC '%s' is present before the run but not after the run\n", pvc) + return fmt.Errorf("mismatch in PVC list before and after the run") + } + } + + // Check for extra PVCs after the run + for pvc := range pvcAfterSet { + if !pvcBeforeSet[pvc] { + fmt.Printf("PVC '%s' is present after the run but not before the run\n", pvc) + return fmt.Errorf("mismatch in PVC list before and after the run") + } + } + + return nil +} diff --git a/tests/basic/asg_test.go b/tests/basic/asg_test.go index 9dc70ce71..8027fdf39 100644 --- a/tests/basic/asg_test.go +++ b/tests/basic/asg_test.go @@ -3,10 +3,12 @@ package tests import ( "fmt" "github.com/libopenstorage/openstorage/api" + "github.com/portworx/sched-ops/k8s/operator" "github.com/portworx/torpedo/drivers/node/ibm" "github.com/portworx/torpedo/drivers/scheduler/aks" "github.com/portworx/torpedo/drivers/scheduler/eks" "github.com/portworx/torpedo/drivers/scheduler/oke" + "github.com/portworx/torpedo/drivers/scheduler/openshift" "github.com/portworx/torpedo/pkg/log" "math/rand" "time" @@ -120,6 +122,112 @@ var _ = Describe("{ClusterScaleUpDown}", func() { }) }) +// This test performs basic test of scaling up and down the asg cluster +var _ = Describe("{ClusterScaleUpIncreasesMaxStorageNodesPerZone}", func() { + + JustBeforeEach(func() { + StartTorpedoTest("ClusterScaleUpIncreasesMaxStorageNodesPerZone", "Validate cluster nodes and storage nodes scale up", nil, testrailID) + + }) + var contexts []*scheduler.Context + + It("has to validate that storage nodes are not lost during asg scaledown", func() { + log.InfoD("Has to validate that storage nodes are not lost during asg scaledown") + contexts = make([]*scheduler.Context, 0) + + for i := 0; i < Inst().GlobalScaleFactor; i++ { + contexts = append(contexts, ScheduleApplications(fmt.Sprintf("asgscaleupdown-%d", i))...) + } + + ValidateApplications(contexts) + + initialNodeCount, err := Inst().S.GetASGClusterSize() + log.FailOnError(err, "Failed to Get ASG cluster size") + + scaleupCount := initialNodeCount + initialNodeCount/2 + + scaleupCount = (scaleupCount / 3) * 3 + stepLog := fmt.Sprintf("scale up cluster from %d to %d nodes and validate", + initialNodeCount, scaleupCount) + + Step(stepLog, func() { + log.InfoD(stepLog) + Scale(scaleupCount) + stepLog = fmt.Sprintf("wait for %s minutes for auto recovery of storeage nodes", + Inst().AutoStorageNodeRecoveryTimeout.String()) + + Step(stepLog, func() { + log.InfoD(stepLog) + time.Sleep(Inst().AutoStorageNodeRecoveryTimeout) + }) + // After scale up, get fresh list of nodes + // by re-initializing scheduler and volume driver + err = Inst().S.RefreshNodeRegistry() + log.FailOnError(err, "Verify node registry refresh") + + err = Inst().V.RefreshDriverEndpoints() + log.FailOnError(err, "Verify driver end points refresh") + + stepLog = "validate number of storage nodes after scale up" + Step(fmt.Sprintf(stepLog), func() { + log.InfoD(stepLog) + ValidateClusterSize(scaleupCount) + }) + PrintPxctlStatus() + }) + + stc, err := Inst().V.GetDriver() + log.FailOnError(err, "error getting volume driver") + maxStorageNodesPerZone := *stc.Spec.CloudStorage.MaxStorageNodesPerZone + numOfStorageNodes := len(node.GetStorageNodes()) + log.Infof("maxStorageNodesPerZone %d", int(maxStorageNodesPerZone)) + log.Infof("numOfStorageNodes %d", numOfStorageNodes) + + actualStorageNodes := numOfStorageNodes + expectedStorageNodes := maxStorageNodesPerZone + + // In multi-zone ASG cluster, node count is per zone + if Inst().S.String() != openshift.SchedName { + zones, err := Inst().S.GetZones() + dash.VerifyFatal(err, nil, "Verify Get zones") + expectedStorageNodes = expectedStorageNodes * uint32(len(zones)) + } + + updatedMaxStorageNodesPerZone := uint32(0) + if int(expectedStorageNodes) <= actualStorageNodes { + //increase max per zone + updatedMaxStorageNodesPerZone = maxStorageNodesPerZone + 1 + } + + initialStorageNodes := node.GetStorageNodes() + + stepLog = "update maxStorageNodesPerZone in storage cluster spec" + Step(stepLog, func() { + log.InfoD(stepLog) + + stc.Spec.CloudStorage.MaxStorageNodesPerZone = &updatedMaxStorageNodesPerZone + log.InfoD("updating maxStorageNodesPerZone from %d to %d", maxStorageNodesPerZone, updatedMaxStorageNodesPerZone) + pxOperator := operator.Instance() + _, err = pxOperator.UpdateStorageCluster(stc) + log.FailOnError(err, "error updating storage cluster") + log.Infof("Sleeping for %v mins for new storage nodes to created", Inst().AutoStorageNodeRecoveryTimeout) + time.Sleep(Inst().AutoStorageNodeRecoveryTimeout) + err = Inst().V.RefreshDriverEndpoints() + log.FailOnError(err, "Verify driver end points refresh") + dash.VerifyFatal(len(node.GetStorageNodes()) > len(initialStorageNodes), true, "verify new storage node is added") + PrintPxctlStatus() + }) + + opts := make(map[string]bool) + opts[scheduler.OptionsWaitForResourceLeakCleanup] = true + ValidateAndDestroy(contexts, opts) + }) + JustAfterEach(func() { + defer EndTorpedoTest() + AfterEachTest(contexts) + }) +}) + // This test randomly kills one volume driver node and ensures cluster remains // intact by ASG var _ = Describe("{ASGKillRandomNodes}", func() { @@ -322,21 +430,435 @@ func waitForIBMNodeTODeploy() error { return err } -func waitForIBMNodeToDelete(nodeToKill node.Node) error { - t := func() (interface{}, bool, error) { +var _ = Describe("{AddStorageNode}", func() { - currState, err := Inst().N.GetNodeState(nodeToKill) - if err != nil { - return "", true, err - } - if currState == ibm.DELETED { - return "", false, nil - } + var contexts []*scheduler.Context + + BeforeEach(func() { + wantAllAfterSuiteActions = false + wantAfterSuiteSystemCheck = true + }) + JustBeforeEach(func() { + StartTorpedoTest("AddStorageNode", "Add a new storage node to the cloud platform", nil, 0) + }) + stepLog := "Validating the drives and pools after adding new storage node" - return "", true, fmt.Errorf("node [%s] not deleted yet, current state : %s", nodeToKill.Hostname, currState) + It(stepLog, func() { + log.InfoD(stepLog) + stepLog = fmt.Sprintf("Adding a storage node to the platform [%s]", Inst().S.String()) - } + Step(stepLog, func() { - _, err := task.DoRetryWithTimeout(t, 10*time.Minute, 1*time.Minute) - return err -} + log.InfoD(stepLog) + contexts = make([]*scheduler.Context, 0) + + for i := 0; i < Inst().GlobalScaleFactor; i++ { + contexts = append(contexts, ScheduleApplications(fmt.Sprintf("addstnode-%d", i))...) + } + + ValidateApplications(contexts) + + var numOfStorageNodes int + var maxStorageNodesPerZone uint32 + var updatedMaxStorageNodesPerZone uint32 = 0 + var zones []string + stepLog = "update maxStorageNodesPerZone in storage cluster spec" + Step(stepLog, func() { + log.InfoD(stepLog) + stc, err := Inst().V.GetDriver() + + log.FailOnError(err, "error getting volume driver") + maxStorageNodesPerZone = *stc.Spec.CloudStorage.MaxStorageNodesPerZone + numOfStorageNodes = len(node.GetStorageNodes()) + log.Infof("maxStorageNodesPerZone %d", int(maxStorageNodesPerZone)) + log.Infof("numOfStorageNodes %d", numOfStorageNodes) + + actualPerZoneCount := numOfStorageNodes + + // In multi-zone ASG cluster, node count is per zone + if Inst().S.String() != openshift.SchedName { + zones, err = Inst().S.GetZones() + dash.VerifyFatal(err, nil, "Verify Get zones") + + actualPerZoneCount = numOfStorageNodes / len(zones) + } + + if int(maxStorageNodesPerZone) <= actualPerZoneCount { + //increase max per zone + updatedMaxStorageNodesPerZone = uint32(actualPerZoneCount + 1) + } + + if updatedMaxStorageNodesPerZone != 0 { + + stc.Spec.CloudStorage.MaxStorageNodesPerZone = &updatedMaxStorageNodesPerZone + log.InfoD("updating maxStorageNodesPerZone from %d to %d", maxStorageNodesPerZone, updatedMaxStorageNodesPerZone) + pxOperator := operator.Instance() + _, err = pxOperator.UpdateStorageCluster(stc) + log.FailOnError(err, "error updating storage cluster") + + } + PrintPxctlStatus() + //Scaling the cluster by one node + expReplicas := len(node.GetStorageDriverNodes()) + 1 + log.InfoD("scaling up the cluster to replicas %d", expReplicas) + Scale(int64(expReplicas)) + stepLog = fmt.Sprintf("wait for %s minutes for auto recovery of storeage nodes", + Inst().AutoStorageNodeRecoveryTimeout.String()) + + Step(stepLog, func() { + log.InfoD(stepLog) + time.Sleep(Inst().AutoStorageNodeRecoveryTimeout) + }) + // After scale up, get fresh list of nodes + // by re-initializing scheduler and volume driver + err = Inst().S.RefreshNodeRegistry() + log.FailOnError(err, "Verify node registry refresh") + + err = Inst().V.RefreshDriverEndpoints() + log.FailOnError(err, "Verify driver end points refresh") + + }) + + stepLog = "validate PX on all nodes after adding a storage node" + + Step(stepLog, func() { + log.InfoD(stepLog) + nodes := node.GetStorageDriverNodes() + for _, n := range nodes { + log.InfoD("Check PX status on %v", n.Name) + err := Inst().V.WaitForPxPodsToBeUp(n) + dash.VerifyFatal(err, nil, fmt.Sprintf("verify px is up on node %s", n.Name)) + } + }) + + err := Inst().V.RefreshDriverEndpoints() + log.FailOnError(err, "error refreshing driver end points") + PrintPxctlStatus() + + expectedPerZone := maxStorageNodesPerZone + if updatedMaxStorageNodesPerZone != 0 { + expectedPerZone = updatedMaxStorageNodesPerZone + } + numOfZones := 1 + if len(zones) != 0 { + numOfZones = len(zones) + } + expectedStorageNodesCount := int(expectedPerZone) * numOfZones + + if expectedStorageNodesCount >= len(node.GetStorageNodes()) { + expectedStorageNodesCount = len(node.GetStorageNodes()) + } + + updatedStorageNodesCount := len(node.GetStorageNodes()) + dash.VerifyFatal(expectedStorageNodesCount, updatedStorageNodesCount, "verify new storage node is added") + ValidateAndDestroy(contexts, nil) + }) + }) + JustAfterEach(func() { + EndTorpedoTest() + }) +}) + +var _ = Describe("{AddStoragelessNode}", func() { + + var contexts []*scheduler.Context + + BeforeEach(func() { + wantAllAfterSuiteActions = false + wantAfterSuiteSystemCheck = true + }) + JustBeforeEach(func() { + StartTorpedoTest("AddStoragelessNode", "Add a new storageless node the cluster", nil, 0) + }) + stepLog := "Validating px after adding new storageless node" + + It(stepLog, func() { + log.InfoD(stepLog) + stepLog = fmt.Sprintf("Adding a storageless node to the platform [%s]", Inst().S.String()) + + Step(stepLog, func() { + + log.InfoD(stepLog) + contexts = make([]*scheduler.Context, 0) + + for i := 0; i < Inst().GlobalScaleFactor; i++ { + contexts = append(contexts, ScheduleApplications(fmt.Sprintf("addslnode-%d", i))...) + } + + ValidateApplications(contexts) + numOfStoragelessNodes := len(node.GetStorageLessNodes()) + + Step(stepLog, func() { + log.InfoD(stepLog) + stc, err := Inst().V.GetDriver() + + log.FailOnError(err, "error getting volume driver") + maxStorageNodesPerZone := *stc.Spec.CloudStorage.MaxStorageNodesPerZone + numOfStorageNodes := len(node.GetStorageNodes()) + log.Infof("maxStorageNodesPerZone %d", int(maxStorageNodesPerZone)) + log.Infof("numOfStoragelessNodes %d", numOfStoragelessNodes) + PrintPxctlStatus() + + var updatedMaxStorageNodesPerZone uint32 = 0 + + actualPerZoneCount := numOfStorageNodes + + // In multi-zone ASG cluster, node count is per zone + if Inst().S.String() != aks.SchedName && Inst().S.String() != openshift.SchedName { + zones, err := Inst().S.GetZones() + dash.VerifyFatal(err, nil, "Verify Get zones") + + actualPerZoneCount = numOfStorageNodes / len(zones) + } + + if int(maxStorageNodesPerZone) > actualPerZoneCount { + //updating max per zone + updatedMaxStorageNodesPerZone = uint32(actualPerZoneCount) + stc.Spec.CloudStorage.MaxStorageNodesPerZone = &updatedMaxStorageNodesPerZone + log.InfoD("updating maxStorageNodesPerZone from %d to %d", maxStorageNodesPerZone, updatedMaxStorageNodesPerZone) + pxOperator := operator.Instance() + _, err = pxOperator.UpdateStorageCluster(stc) + log.FailOnError(err, "error updating storage cluster") + } + //Scaling the cluster by one node + expReplicas := len(node.GetStorageDriverNodes()) + 1 + log.InfoD("scaling up the cluster to replicas %d", expReplicas) + Scale(int64(expReplicas)) + + }) + + stepLog = fmt.Sprintf("wait for %s minutes for auto recovery of storeage nodes", + Inst().AutoStorageNodeRecoveryTimeout.String()) + + Step(stepLog, func() { + log.InfoD(stepLog) + time.Sleep(Inst().AutoStorageNodeRecoveryTimeout) + }) + // After scale up, get fresh list of nodes + // by re-initializing scheduler and volume driver + err = Inst().S.RefreshNodeRegistry() + log.FailOnError(err, "Verify node registry refresh") + + err = Inst().V.RefreshDriverEndpoints() + log.FailOnError(err, "Verify driver end points refresh") + + stepLog = "validate PX on all nodes after adding storageless node" + + Step(stepLog, func() { + log.InfoD(stepLog) + nodes := node.GetStorageDriverNodes() + for _, n := range nodes { + log.InfoD("Check PX status on %v", n.Name) + err := Inst().V.WaitForPxPodsToBeUp(n) + dash.VerifyFatal(err, nil, fmt.Sprintf("verify px is up on node %s", n.Name)) + } + }) + + err := Inst().V.RefreshDriverEndpoints() + log.FailOnError(err, "error refreshing driver end points") + PrintPxctlStatus() + + updatedStoragelessNodesCount := len(node.GetStorageLessNodes()) + dash.VerifyFatal(numOfStoragelessNodes+1, updatedStoragelessNodesCount, "verify new storageless node is added") + + ValidateAndDestroy(contexts, nil) + }) + }) + JustAfterEach(func() { + EndTorpedoTest() + }) +}) + +var _ = Describe("{RecycleStorageDriverNode}", func() { + + var contexts []*scheduler.Context + + BeforeEach(func() { + wantAllAfterSuiteActions = false + wantAfterSuiteSystemCheck = true + }) + JustBeforeEach(func() { + StartTorpedoTest("RecycleStorageDriverNode", "Test drives and pools after recycling a storage driver node", nil, 0) + }) + + It("Validating the drives and pools after recycling a node", func() { + Step("Get the storage and storageless nodes and delete them", func() { + contexts = make([]*scheduler.Context, 0) + for i := 0; i < Inst().GlobalScaleFactor; i++ { + contexts = append(contexts, ScheduleApplications(fmt.Sprintf("recyclenode-%d", i))...) + } + ValidateApplications(contexts) + storagelessNodes, err := Inst().V.GetStoragelessNodes() + log.FailOnError(err, fmt.Sprintf("Failed to get storageless nodes. Error: [%v]", err)) + if storagelessNodes != nil { + delNode, err := node.GetNodeByName(storagelessNodes[0].Hostname) + log.FailOnError(err, fmt.Sprintf("Failed to get node object using Name. Error: [%v]", err)) + Step( + fmt.Sprintf("Listing all nodes before recycling a storageless node %s", delNode.Name), + func() { + workerNodes := node.GetWorkerNodes() + for x, wNode := range workerNodes { + log.Infof("WorkerNode[%d] is: [%s] and volDriverID is [%s]", x, wNode.Name, wNode.VolDriverNodeID) + } + }) + stepLog = fmt.Sprintf("Recycle a storageless node and validating the drives: %s", delNode.Name) + Step( + stepLog, + func() { + log.InfoD(stepLog) + err := Inst().S.DeleteNode(delNode) + log.FailOnError(err, fmt.Sprintf("Failed to recycle a node [%s]. Error: [%v]", delNode.Name, err)) + waitTime := 10 + if Inst().S.String() == oke.SchedName { + waitTime = 15 // OKE takes more time to replace the node + } + + stepLog = fmt.Sprintf("Wait for %d min. to node get replaced by autoscalling group", waitTime) + Step(stepLog, func() { + log.InfoD(stepLog) + time.Sleep(time.Duration(waitTime) * time.Minute) + }) + + err = Inst().S.RefreshNodeRegistry() + log.FailOnError(err, "Verify node registry refresh") + + err = Inst().V.RefreshDriverEndpoints() + log.FailOnError(err, "Verify driver end points refresh") + stepLog = fmt.Sprintf("Validate number of storage nodes after recycling node [%v]", delNode.Name) + Step(stepLog, func() { + log.InfoD(stepLog) + ValidateClusterSize(int64(len(node.GetStorageDriverNodes()))) + PrintPxctlStatus() + }) + }) + Step( + fmt.Sprintf("Listing all nodes after recycle a storageless node %s", delNode.Name), + func() { + workerNodes := node.GetWorkerNodes() + for x, wNode := range workerNodes { + log.Infof("WorkerNode[%d] is: [%s] and volDriverID is [%s]", x, wNode.Name, wNode.VolDriverNodeID) + } + }) + } + // Validating the apps after recycling the StorageLess node + ValidateApplications(contexts) + workerNodes := node.GetStorageNodes() + delNode := workerNodes[0] + stepLog := fmt.Sprintf("Recycle a storage node: [%s] and validating the drives", delNode.Name) + Step( + stepLog, + func() { + log.InfoD(stepLog) + err := Inst().S.DeleteNode(delNode) + log.FailOnError(err, fmt.Sprintf("Failed to recycle a node [%s]. Error: [%v]", delNode.Name, err)) + waitTime := 10 + if Inst().S.String() == oke.SchedName { + waitTime = 15 // OKE takes more time to replace the node + } + + stepLog = fmt.Sprintf("Wait for %d min. to node get replaced by autoscalling group", waitTime) + Step(stepLog, func() { + log.InfoD(stepLog) + time.Sleep(time.Duration(waitTime) * time.Minute) + }) + + err = Inst().S.RefreshNodeRegistry() + log.FailOnError(err, "Verify node registry refresh") + + err = Inst().V.RefreshDriverEndpoints() + log.FailOnError(err, "Verify driver end points refresh") + stepLog = fmt.Sprintf("Validate number of storage nodes after recycling node [%v]", delNode.Name) + Step(stepLog, func() { + log.InfoD(stepLog) + ValidateClusterSize(int64(len(node.GetStorageDriverNodes()))) + }) + }) + Step(fmt.Sprintf("Listing all nodes after recycling a storage node %s", delNode.Name), func() { + workerNodes := node.GetWorkerNodes() + for x, wNode := range workerNodes { + log.Infof("WorkerNode[%d] is: [%s] and volDriverID is [%s]", x, wNode.Name, wNode.VolDriverNodeID) + } + PrintPxctlStatus() + }) + // Validating the apps after recycling the Storage node + ValidateApplications(contexts) + }) + }) + JustAfterEach(func() { + EndTorpedoTest() + }) +}) + +var _ = Describe("{RecycleAllStorageDriverNodes}", func() { + + var contexts []*scheduler.Context + + BeforeEach(func() { + wantAllAfterSuiteActions = false + wantAfterSuiteSystemCheck = true + }) + JustBeforeEach(func() { + StartTorpedoTest("RecycleAllStorageDriverNodes", "Test drives and pools after recycling a all storage driver nodes one by one", nil, 0) + }) + + It("Validating the drives and pools after recycling a node", func() { + Step("Get the storage and storageless nodes and delete them", func() { + contexts = make([]*scheduler.Context, 0) + for i := 0; i < Inst().GlobalScaleFactor; i++ { + contexts = append(contexts, ScheduleApplications(fmt.Sprintf("recyclenode-%d", i))...) + } + ValidateApplications(contexts) + + existingStorageDriverNodes := node.GetStorageDriverNodes() + + for _, existingStorageDriverNode := range existingStorageDriverNodes { + stepLog := fmt.Sprintf("Recycling node: [%s]", existingStorageDriverNode.Name) + Step( + stepLog, + func() { + log.InfoD(stepLog) + err := Inst().S.DeleteNode(existingStorageDriverNode) + log.FailOnError(err, fmt.Sprintf("Failed to recycle a node [%s]. Error: [%v]", existingStorageDriverNode.Name, err)) + waitTime := 10 + if Inst().S.String() == oke.SchedName { + waitTime = 15 // OKE takes more time to replace the node + } + + stepLog = fmt.Sprintf("Wait for %d min. to node get replaced by autoscalling group", waitTime) + Step(stepLog, func() { + log.InfoD(stepLog) + time.Sleep(time.Duration(waitTime) * time.Minute) + }) + err = Inst().S.RefreshNodeRegistry() + log.FailOnError(err, "Verify node registry refresh") + + err = Inst().V.RefreshDriverEndpoints() + log.FailOnError(err, "Verify driver end points refresh") + stepLog = fmt.Sprintf("Validate number of storage nodes after recycling node [%v]", existingStorageDriverNode.Name) + Step(stepLog, func() { + log.InfoD(stepLog) + ValidateClusterSize(int64(len(node.GetStorageDriverNodes()))) + PrintPxctlStatus() + }) + nodeIdExists := false + if len(existingStorageDriverNode.StorageNode.Pools) > 0 { + newStorageDriverNodes := node.GetStorageDriverNodes() + for _, newStorageDriverNode := range newStorageDriverNodes { + if newStorageDriverNode.VolDriverNodeID == existingStorageDriverNode.VolDriverNodeID { + nodeIdExists = true + break + } + } + dash.VerifyFatal(nodeIdExists, true, fmt.Sprintf("Node ID [%s] exists after deleting storage node [%v]", existingStorageDriverNode.VolDriverNodeID, existingStorageDriverNode.Name)) + } + + }) + } + // Validating the apps after recycling the Storage driver node + ValidateApplications(contexts) + }) + }) + JustAfterEach(func() { + EndTorpedoTest() + }) +}) diff --git a/tests/basic/async_dr_test.go b/tests/basic/async_dr_test.go index b0fa3f2eb..67be4a3c0 100644 --- a/tests/basic/async_dr_test.go +++ b/tests/basic/async_dr_test.go @@ -10,13 +10,19 @@ import ( storkapi "github.com/libopenstorage/stork/pkg/apis/stork/v1alpha1" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "github.com/portworx/sched-ops/k8s/apps" + "github.com/portworx/sched-ops/k8s/core" + "github.com/portworx/sched-ops/k8s/stork" storkops "github.com/portworx/sched-ops/k8s/stork" "github.com/portworx/sched-ops/task" meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/rest" + "k8s.io/client-go/tools/clientcmd" "github.com/portworx/torpedo/drivers/scheduler" "github.com/portworx/torpedo/pkg/asyncdr" "github.com/portworx/torpedo/pkg/log" + "github.com/portworx/torpedo/pkg/storkctlcli" //"github.com/portworx/torpedo/driver "github.com/portworx/torpedo/drivers/scheduler" //"github.com/portworx/torpedo/drivers/scheduler/spec" @@ -25,24 +31,37 @@ import ( ) const ( - migrationRetryTimeout = 10 * time.Minute - migrationRetryInterval = 10 * time.Second - domainCheckRetryTimeout = 1 * time.Minute - defaultClusterPairDir = "cluster-pair" - defaultClusterPairDirNew = "cluster-pair-new" - defaultClusterPairName = "remoteclusterpair" + migrationRetryTimeout = 10 * time.Minute + migrationRetryInterval = 10 * time.Second + domainCheckRetryTimeout = 1 * time.Minute + defaultClusterPairDir = "cluster-pair" + defaultClusterPairDirNew = "cluster-pair-new" + defaultClusterPairName = "remoteclusterpair" defaultClusterPairNameNew = "remoteclusterpairnew" - defaultBackupLocation = "s3" - defaultSecret = "s3secret" - - migrationKey = "async-dr-" - metromigrationKey = "metro-dr-" + defaultBackupLocation = "s3" + defaultSecret = "s3secret" + defaultMigSchedName = "automation-migration-schedule-" + migrationKey = "async-dr-" + migrationSchedKey = "mig-sched-" + metromigrationKey = "metro-dr-" ) var ( - kubeConfigWritten bool + kubeConfigWritten bool ) +type failoverFailbackParam struct { + action string + failoverOrFailbackNs string + migrationSchedName string + configPath string + single bool + skipSourceOp bool + includeNs bool + excludeNs bool + extraArgsFailoverFailback map[string]string + contexts []*scheduler.Context +} // This test performs basic test of starting an application, creating cluster pair, // and migrating application to the destination clsuter @@ -75,6 +94,7 @@ var _ = Describe("{MigrateDeployment}", func() { err := SetSourceKubeConfig() log.FailOnError(err, "Switching context to source cluster failed") + // Schedule applications for i := 0; i < Inst().GlobalScaleFactor; i++ { taskName := fmt.Sprintf("%s-%d", taskNamePrefix, i) log.Infof("Task name %s\n", taskName) @@ -168,29 +188,29 @@ var _ = Describe("{MigrateDeploymentMetroAsync}", func() { }) JustBeforeEach(func() { skipFlag := getClusterDomainsInfo() - if skipFlag { - Skip("Skip test because cluster domains are not set") - } + if skipFlag { + Skip("Skip test because cluster domains are not set") + } StartTorpedoTest("MigrateDeploymentMetroAsync", "Migration of application using metro+async combination", nil, testrailID) runID = testrailuttils.AddRunsToMilestone(testrailID) }) var ( - contexts []*scheduler.Context - migrationNamespaces []string - taskNamePrefix = "metro-async-dr-mig" - allMigrationsMetro []*storkapi.Migration - allMigrationsAsync []*storkapi.Migration - includeResourcesFlag = true + contexts []*scheduler.Context + migrationNamespaces []string + taskNamePrefix = "metro-async-dr-mig" + allMigrationsMetro []*storkapi.Migration + allMigrationsAsync []*storkapi.Migration + includeResourcesFlag = true includeVolumesFlagMetro = false includeVolumesFlagAsync = true - startApplicationsFlag = false + startApplicationsFlag = false ) It("has to deploy app, create cluster pair, migrate app", func() { Step("Deploy applications", func() { err = SetCustomKubeConfig(asyncdr.FirstCluster) - log.FailOnError(err, "Switching context to first cluster failed") + log.FailOnError(err, "Switching context to first cluster failed") for i := 0; i < Inst().GlobalScaleFactor; i++ { taskName := fmt.Sprintf("%s-%d", taskNamePrefix, i) log.Infof("Task name %s\n", taskName) @@ -220,7 +240,7 @@ var _ = Describe("{MigrateDeploymentMetroAsync}", func() { migrationKey, currMigNamespace, err)) allMigrationsMetro = append(allMigrationsMetro, currMig) } - + // Validate all migrations for _, mig := range allMigrationsMetro { err := storkops.Instance().ValidateMigration(mig.Name, mig.Namespace, migrationRetryTimeout, migrationRetryInterval) @@ -230,7 +250,7 @@ var _ = Describe("{MigrateDeploymentMetroAsync}", func() { } err = SetCustomKubeConfig(asyncdr.SecondCluster) - log.FailOnError(err, "Switching context to second cluster failed") + log.FailOnError(err, "Switching context to second cluster failed") log.Infof("Start Async migration from Second DR to Third DR") @@ -259,6 +279,301 @@ var _ = Describe("{MigrateDeploymentMetroAsync}", func() { }) }) +var _ = Describe("{StorkctlPerformFailoverFailbackDefaultAsyncSingle}", func() { + testrailID = 296255 + // testrailID corresponds to: https://portworx.testrail.net/index.php?/cases/view/296255 + BeforeEach(func() { + if !kubeConfigWritten { + // Write kubeconfig files after reading from the config maps created by torpedo deploy script + WriteKubeconfigToFiles() + kubeConfigWritten = true + } + wantAllAfterSuiteActions = false + }) + JustBeforeEach(func() { + StartTorpedoTest("StorkctlPerformFailoverFailbackDefaultAsyncSingle", "Failover and Failback using storkctl on async cluster for single NS", nil, testrailID) + runID = testrailuttils.AddRunsToMilestone(testrailID) + }) + + It("has to deploy app, create cluster pair, migrate app and do failover/failback", func() { + Step("Deploy app, Create cluster pair, Migrate app and Do failover/failback", func() { + validateFailoverFailback("asyncdr", "asyncdr-failover-failback", true, false, false, false) + }) + }) + JustAfterEach(func() { + defer EndTorpedoTest() + AfterEachTest(contexts, testrailID, runID) + }) +}) + +var _ = Describe("{StorkctlPerformFailoverFailbackDefaultAsyncSkipSourceOperations}", func() { + testrailID = 296256 + // testrailID corresponds to: https://portworx.testrail.net/index.php?/cases/view/296256 + BeforeEach(func() { + if !kubeConfigWritten { + // Write kubeconfig files after reading from the config maps created by torpedo deploy script + WriteKubeconfigToFiles() + kubeConfigWritten = true + } + wantAllAfterSuiteActions = false + }) + JustBeforeEach(func() { + StartTorpedoTest("StorkctlPerformFailoverFailbackDefaultAsyncSkipSourceOperations", "Failover and Failback using storkctl on async cluster with skip source operations", nil, testrailID) + runID = testrailuttils.AddRunsToMilestone(testrailID) + }) + + It("has to deploy app, create cluster pair, migrate app and do failover/failback", func() { + Step("Deploy app, Create cluster pair, Migrate app and Do failover/failback", func() { + validateFailoverFailback("asyncdr", "asyncdr-failover-failback", false, true, false, false) + }) + }) + JustAfterEach(func() { + defer EndTorpedoTest() + AfterEachTest(contexts, testrailID, runID) + }) +}) + +var _ = Describe("{StorkctlPerformFailoverFailbackDefaultAsyncIncludeNs}", func() { + testrailID = 296368 + // testrailID corresponds to: https://portworx.testrail.net/index.php?/cases/view/296368 + BeforeEach(func() { + if !kubeConfigWritten { + // Write kubeconfig files after reading from the config maps created by torpedo deploy script + WriteKubeconfigToFiles() + kubeConfigWritten = true + } + wantAllAfterSuiteActions = false + }) + JustBeforeEach(func() { + StartTorpedoTest("StorkctlPerformFailoverFailbackDefaultAsyncIncludeNs", "Failover and Failback using storkctl on async cluster with Include Ns", nil, testrailID) + runID = testrailuttils.AddRunsToMilestone(testrailID) + }) + + It("has to deploy app, create cluster pair, migrate app and do failover/failback", func() { + Step("Deploy app, Create cluster pair, Migrate app and Do failover/failback", func() { + validateFailoverFailback("asyncdr", "asyncdr-failover-failback", false, false, true, false) + }) + }) + JustAfterEach(func() { + defer EndTorpedoTest() + AfterEachTest(contexts, testrailID, runID) + }) +}) + +var _ = Describe("{StorkctlPerformFailoverFailbackDefaultAsyncExcludeNs}", func() { + testrailID = 296367 + // testrailID corresponds to: https://portworx.testrail.net/index.php?/cases/view/296367 + BeforeEach(func() { + if !kubeConfigWritten { + // Write kubeconfig files after reading from the config maps created by torpedo deploy script + WriteKubeconfigToFiles() + kubeConfigWritten = true + } + wantAllAfterSuiteActions = false + }) + JustBeforeEach(func() { + StartTorpedoTest("StorkctlPerformFailoverFailbackDefaultAsyncExcludeNs", "Failover and Failback using storkctl on async cluster with Exclude Ns", nil, testrailID) + runID = testrailuttils.AddRunsToMilestone(testrailID) + }) + + It("has to deploy app, create cluster pair, migrate app and do failover/failback", func() { + Step("Deploy app, Create cluster pair, Migrate app and Do failover/failback", func() { + validateFailoverFailback("asyncdr", "asyncdr-failover-failback", false, false, false, true) + }) + }) + JustAfterEach(func() { + defer EndTorpedoTest() + AfterEachTest(contexts, testrailID, runID) + }) +}) + +var _ = Describe("{StorkctlPerformFailoverFailbackDefaultAsyncMultiple}", func() { + testrailID = 296255 + // testrailID corresponds to: https://portworx.testrail.net/index.php?/cases/view/296255 + BeforeEach(func() { + if !kubeConfigWritten { + // Write kubeconfig files after reading from the config maps created by torpedo deploy script + WriteKubeconfigToFiles() + kubeConfigWritten = true + } + wantAllAfterSuiteActions = false + }) + JustBeforeEach(func() { + StartTorpedoTest("StorkctlPerformFailoverFailbackDefaultAsyncMultiple", "Failover and Failback using storkctl on async cluster for multiple NS", nil, testrailID) + runID = testrailuttils.AddRunsToMilestone(testrailID) + }) + + It("has to deploy app, create cluster pair, migrate app and do failover/failback", func() { + Step("Deploy app, Create cluster pair, Migrate app and Do failover/failback", func() { + validateFailoverFailback("asyncdr", "asyncdr-failover-failback", false, false, false, false) + }) + }) + JustAfterEach(func() { + defer EndTorpedoTest() + AfterEachTest(contexts, testrailID, runID) + }) +}) + +var _ = Describe("{StorkctlPerformFailoverFailbackDefaultMetroSingle}", func() { + testrailID = 296291 + // testrailID corresponds to: https://portworx.testrail.net/index.php?/cases/view/296291 + BeforeEach(func() { + if !kubeConfigWritten { + // Write kubeconfig files after reading from the config maps created by torpedo deploy script + WriteKubeconfigToFiles() + kubeConfigWritten = true + } + wantAllAfterSuiteActions = false + }) + JustBeforeEach(func() { + skipFlag := getClusterDomainsInfo() + if skipFlag { + Skip("Skip test because cluster domains are not set") + } + StartTorpedoTest("StorkctlPerformFailoverFailbackDefaultMetroSingle", "Failover and Failback using storkctl on metro cluster for single NS", nil, testrailID) + runID = testrailuttils.AddRunsToMilestone(testrailID) + }) + + It("has to deploy app, create cluster pair, migrate app and do failover/failback", func() { + Step("Deploy app, Create cluster pair, Migrate app and Do failover/failback", func() { + validateFailoverFailback("metrodr", "metrodr-failover-failback", true, false, false, false) + }) + }) + JustAfterEach(func() { + defer EndTorpedoTest() + AfterEachTest(contexts, testrailID, runID) + }) +}) + +var _ = Describe("{StorkctlPerformFailoverFailbackDefaultMetroMultiple}", func() { + testrailID = 296291 + // testrailID corresponds to: https://portworx.testrail.net/index.php?/cases/view/296291 + BeforeEach(func() { + if !kubeConfigWritten { + // Write kubeconfig files after reading from the config maps created by torpedo deploy script + WriteKubeconfigToFiles() + kubeConfigWritten = true + } + wantAllAfterSuiteActions = false + }) + JustBeforeEach(func() { + skipFlag := getClusterDomainsInfo() + if skipFlag { + Skip("Skip test because cluster domains are not set") + } + StartTorpedoTest("StorkctlPerformFailoverFailbackDefaultMetroMultiple", "Failover and Failback using storkctl on metro cluster for multiple NS", nil, testrailID) + runID = testrailuttils.AddRunsToMilestone(testrailID) + }) + + It("has to deploy app, create cluster pair, migrate app and do failover/failback", func() { + Step("Deploy app, Create cluster pair, Migrate app and Do failover/failback", func() { + validateFailoverFailback("metrodr", "metrodr-failover-failback", false, false, false, false) + }) + }) + JustAfterEach(func() { + defer EndTorpedoTest() + AfterEachTest(contexts, testrailID, runID) + }) +}) + +func validateFailoverFailback(clusterType, taskNamePrefix string, single, skipSourceOp, includeNs, excludeNs bool) { + defaultNs := "kube-system" + migrationNamespaces, contexts := initialSetupApps(taskNamePrefix, single) + migNamespaces := strings.Join(migrationNamespaces, ",") + kubeConfigPathSrc, err := GetCustomClusterConfigPath(asyncdr.FirstCluster) + log.FailOnError(err, "Failed to get source configPath: %v", err) + kubeConfigPathDest, err := GetCustomClusterConfigPath(asyncdr.SecondCluster) + log.FailOnError(err, "Failed to get destination configPath: %v", err) + if single { + defaultNs = migrationNamespaces[0] + migNamespaces = defaultNs + } + extraArgs := map[string]string{ + "namespaces": migNamespaces, + "kubeconfig": kubeConfigPathSrc, + } + log.Infof("Creating clusterpair between first and second cluster") + cpName := defaultClusterPairName + time.Now().Format("15h03m05s") + if clusterType == "asyncdr" { + err = ScheduleBidirectionalClusterPair(cpName, defaultNs, "", storkapi.BackupLocationType(defaultBackupLocation), defaultSecret, "async-dr", asyncdr.FirstCluster, asyncdr.SecondCluster) + } else { + err = ScheduleBidirectionalClusterPair(cpName, defaultNs, "", "", "", "sync-dr", asyncdr.FirstCluster, asyncdr.SecondCluster) + } + log.FailOnError(err, "Failed creating bidirectional cluster pair") + log.Infof("Start migration schedule and perform failover") + migrationSchedName := migrationSchedKey + time.Now().Format("15h03m05s") + createMigSchdAndValidateMigration(migrationSchedName, cpName, defaultNs, kubeConfigPathSrc, extraArgs) + err = SetCustomKubeConfig(asyncdr.SecondCluster) + log.FailOnError(err, "Switching context to second cluster failed") + extraArgsFailoverFailback := map[string]string{ + "kubeconfig": kubeConfigPathDest, + } + if includeNs { + extraArgsFailoverFailback["include-namespaces"] = migrationNamespaces[0] + } + if excludeNs { + extraArgsFailoverFailback["exclude-namespaces"] = migrationNamespaces[0] + } + failoverParam := failoverFailbackParam{ + action: "failover", + failoverOrFailbackNs: defaultNs, + migrationSchedName: migrationSchedName, + configPath: kubeConfigPathDest, + single: single, + skipSourceOp: skipSourceOp, + includeNs: includeNs, + excludeNs: excludeNs, + extraArgsFailoverFailback: extraArgsFailoverFailback, + contexts: contexts, + } + performFailoverFailback(failoverParam) + if skipSourceOp { + err = hardSetConfig(kubeConfigPathSrc) + log.FailOnError(err, "Error setting source config: %v", err) + for _, ctx := range contexts { + waitForPodsToBeRunning(ctx, false) + } + } else { + err = hardSetConfig(kubeConfigPathDest) + log.FailOnError(err, "Error setting destination config: %v", err) + extraArgs["kubeconfig"] = kubeConfigPathDest + newMigSched := migrationSchedName + "-rev" + if includeNs { + extraArgs["namespaces"] = migrationNamespaces[0] + } + if excludeNs { + extraArgs["namespaces"] = strings.Join(migrationNamespaces[1:], ",") + extraArgsFailoverFailback["exclude-namespaces"] = migrationNamespaces[1] + } + createMigSchdAndValidateMigration(newMigSched, cpName, defaultNs, kubeConfigPathDest, extraArgs) + failoverback := failoverFailbackParam{ + action: "failback", + failoverOrFailbackNs: defaultNs, + migrationSchedName: newMigSched, + configPath: kubeConfigPathDest, + single: single, + skipSourceOp: false, + includeNs: includeNs, + excludeNs: excludeNs, + extraArgsFailoverFailback: extraArgsFailoverFailback, + contexts: contexts, + } + performFailoverFailback(failoverback) + } + err = asyncdr.WaitForNamespaceDeletion(migrationNamespaces) + if err != nil { + log.Infof("Failed to delete namespaces: %v", err) + } + err = hardSetConfig(kubeConfigPathDest) + if err != nil { + log.Infof("Failed to se dest kubeconfig for NS deletion on dest: %v", err) + } + err = asyncdr.WaitForNamespaceDeletion(migrationNamespaces) + if err != nil { + log.Infof("Failed to delete namespaces: %v", err) + } +} + func getClusterDomainsInfo() bool { skipFlag := false listCdsTask := func() (interface{}, bool, error) { @@ -376,3 +691,136 @@ func DeleteAndWaitForMigrationDeletion(name, namespace string) error { _, err = task.DoRetryWithTimeout(getMigration, migrationRetryTimeout, migrationRetryInterval) return err } + +func initialSetupApps(taskNamePrefix string, single bool) ([]string, []*scheduler.Context) { + var contexts []*scheduler.Context + var migrationNamespaces []string + + err = SetCustomKubeConfig(asyncdr.FirstCluster) + log.FailOnError(err, "Switching context to first cluster failed") + if single { + taskName := fmt.Sprintf("%s", taskNamePrefix) + log.Infof("Task name %s\n", taskName) + contexts = append(contexts, ScheduleApplications(taskName)...) + } else { + for i := 0; i < Inst().GlobalScaleFactor; i++ { + taskName := fmt.Sprintf("%s-%d", taskNamePrefix, i) + log.Infof("Task name %s\n", taskName) + contexts = append(contexts, ScheduleApplications(taskName)...) + } + } + for _, ctx := range contexts { + // Override default App readiness time out of 5 mins with 10 mins + ctx.ReadinessTimeout = appReadinessTimeout + namespace := GetAppNamespace(ctx, "") + migrationNamespaces = append(migrationNamespaces, namespace) + } + log.Infof("Migration Namespaces are : [%v]", migrationNamespaces) + ValidateApplications(contexts) + return migrationNamespaces, contexts +} + +func createMigSchdAndValidateMigration(migSchedName, cpName, migNs, resetConfigPath string, extraArgs map[string]string) { + var migration *storkapi.Migration + err = storkctlcli.ScheduleStorkctlMigrationSched(migSchedName, cpName, migNs, extraArgs) + log.FailOnError(err, "Error creating migrationschedule: %v", err) + err = hardSetConfig(resetConfigPath) + log.FailOnError(err, "Error setting destination config: %v", err) + migSchedule, err := storkops.Instance().GetMigrationSchedule(migSchedName, migNs) + log.FailOnError(err, "failed to get migrationschedule %v, err: %v", migSchedName, err) + time.Sleep(time.Second * 30) + migrations := migSchedule.Status.Items["Interval"] + for _, mig := range migrations { + migration, err = storkops.Instance().GetMigration(mig.Name, migNs) + log.FailOnError(err, "failed to get migration for migrationschedule %v, err: %v", migSchedName, err) + err = WaitForMigration([]*storkapi.Migration{migration}) + log.FailOnError(err, "Migration failed with error: %v", err) + } +} + +func performFailoverFailback(foFbParams failoverFailbackParam) { + err, output := storkctlcli.PerformFailoverOrFailback(foFbParams.action, foFbParams.failoverOrFailbackNs, foFbParams.migrationSchedName, foFbParams.skipSourceOp, foFbParams.extraArgsFailoverFailback) + log.FailOnError(err, "Error running perform %v: %v", foFbParams.action, err) + splitOutput := strings.Split(output, "\n") + prefix := fmt.Sprintf("To check %s status use the command : `", foFbParams.action) + getStatusCommand := strings.TrimSpace(strings.TrimPrefix(splitOutput[1], prefix)) + getStatusCommand = strings.TrimSuffix(getStatusCommand, "`") + getStatusCmdArgs := strings.Split(getStatusCommand, " ") + // Extract the action Name from the command args + actionName := getStatusCmdArgs[3] + err = storkctlcli.WaitForActionSuccessful(actionName, foFbParams.failoverOrFailbackNs, Inst().GlobalScaleFactor) + log.FailOnError(err, "Error in performing %v: %v", foFbParams.action, err) + validatePodsRunning(foFbParams.action, foFbParams.single, foFbParams.includeNs, foFbParams.excludeNs, foFbParams.contexts) +} + +func validatePodsRunning(action string, single, includeNs, excludeNs bool, contexts []*scheduler.Context) { + switch action { + case "failover": + if includeNs { + waitForPodsToBeRunning(contexts[0], false) + for i := 1; i < len(contexts); i++ { + ctx := contexts[i] + waitForPodsToBeRunning(ctx, true) + } + } else if excludeNs { + waitForPodsToBeRunning(contexts[0], true) + for i := 1; i < len(contexts); i++ { + ctx := contexts[i] + waitForPodsToBeRunning(ctx, false) + } + } else if single { + waitForPodsToBeRunning(contexts[0], false) + } else { + for _, ctx := range contexts { + waitForPodsToBeRunning(ctx, false) + } + } + case "failback": + kubeConfigPathSrc, err := GetCustomClusterConfigPath(asyncdr.FirstCluster) + log.FailOnError(err, "Failed to get source configPath: %v", err) + err = hardSetConfig(kubeConfigPathSrc) + log.FailOnError(err, "Error setting source config") + if includeNs { + for _, ctx := range contexts { + waitForPodsToBeRunning(ctx, false) + } + } else if excludeNs { + for i := 1; i < len(contexts); i++ { + ctx := contexts[i] + if i == 1 { + waitForPodsToBeRunning(ctx, true) + } else { + waitForPodsToBeRunning(ctx, false) + } + } + } else if single { + waitForPodsToBeRunning(contexts[0], false) + } else { + for _, ctx := range contexts { + waitForPodsToBeRunning(ctx, false) + } + } + } +} + +func hardSetConfig(configPath string) error { + var config *rest.Config + config, err = clientcmd.BuildConfigFromFlags("", configPath) + if err != nil { + return err + } + core.Instance().SetConfig(config) + apps.Instance().SetConfig(config) + stork.Instance().SetConfig(config) + return nil +} + +func waitForPodsToBeRunning(context *scheduler.Context, expectedFail bool) { + log.Infof("Verifying Context [%v]", context.App.Key) + err := Inst().S.WaitForRunning(context, 5 * time.Minute, 10 * time.Second) + if expectedFail { + log.FailOnNoError(err, "Pods are up on destination, they shouldn't be up") + } else { + log.FailOnError(err, "Error waiting for pods to be up") + } +} \ No newline at end of file diff --git a/tests/basic/autopilot_test.go b/tests/basic/autopilot_test.go index 7e0ff5edf..0a63e24fc 100644 --- a/tests/basic/autopilot_test.go +++ b/tests/basic/autopilot_test.go @@ -999,7 +999,7 @@ var _ = Describe(fmt.Sprintf("{%sPvcAndPoolExpand}", testSuiteName), func() { var contexts []*scheduler.Context It("has to fill up the volume completely, resize the volumes and storage pool(s), validate and teardown apps", func() { testName := strings.ToLower(fmt.Sprintf("%sPvcAndPoolExpand", testSuiteName)) - poolLabel := map[string]string{"autopilot": "adddisk"} + poolLabel := map[string]string{"autopilot": "resizedisk"} pvcLabel := map[string]string{"autopilot": "pvc-expand"} storageNodes := node.GetStorageDriverNodes() pvcApRules := []apapi.AutopilotRule{ @@ -1007,7 +1007,7 @@ var _ = Describe(fmt.Sprintf("{%sPvcAndPoolExpand}", testSuiteName), func() { aututils.PVCRuleByTotalSize(10, 100, ""), } poolApRules := []apapi.AutopilotRule{ - aututils.PoolRuleByTotalSize((getTotalPoolSize(storageNodes[0])/units.GiB)+1, 10, aututils.RuleScaleTypeAddDisk, poolLabel), + aututils.PoolRuleByTotalSize((getTotalPoolSize(storageNodes[0])/units.GiB)+1, 10, aututils.RuleScaleTypeResizeDisk, poolLabel), } Step("schedule apps with autopilot rules for pool expand", func() { diff --git a/tests/basic/customer_issues_test.go b/tests/basic/customer_issues_test.go index f88cbb05e..43041a9ed 100644 --- a/tests/basic/customer_issues_test.go +++ b/tests/basic/customer_issues_test.go @@ -589,17 +589,10 @@ var _ = Describe("{CreateCloudSnapAndDelete}", func() { stepLog := "has to schedule cloud snap and delete cloudsnaps" It(stepLog, func() { log.InfoD(stepLog) - n := node.GetStorageDriverNodes()[0] - uuidCmd := "pxctl cred list -j | grep uuid" - output, err := runCmd(uuidCmd, n) - log.FailOnError(err, "error getting uuid for cloudsnap credential") - if output == "" { - log.FailOnError(fmt.Errorf("cloud cred is not created"), "Check for cloud cred exists?") - } - credUUID := strings.Split(strings.TrimSpace(output), " ")[1] - credUUID = strings.ReplaceAll(credUUID, "\"", "") - log.Infof("Got Cred UUID: %s", credUUID) + err := CreatePXCloudCredential() + log.FailOnError(err, "failed to create cloud credential") + contexts = make([]*scheduler.Context, 0) policyName := "intervalpolicy" appScale := 5 @@ -628,6 +621,11 @@ var _ = Describe("{CreateCloudSnapAndDelete}", func() { log.FailOnError(err, fmt.Sprintf("error creating a SchedulePolicy [%s]", policyName)) } + defer func() { + err := storkops.Instance().DeleteSchedulePolicy(policyName) + log.FailOnError(err, fmt.Sprintf("error deleting a SchedulePolicy [%s]", policyName)) + }() + for i := 0; i < appScale; i++ { contexts = append(contexts, ScheduleApplications(fmt.Sprintf("cloudsnap-%d", i))...) } @@ -762,15 +760,11 @@ var _ = Describe("{CreateCloudSnapAndDelete}", func() { } log.FailOnError(err, fmt.Sprintf("error deleting Cloudsnap %s", bk.Id)) } - } - } - - opts := make(map[string]bool) - opts[scheduler.OptionsWaitForResourceLeakCleanup] = true - ValidateAndDestroy(contexts, opts) - + for _, ctx := range contexts { + ValidateContext(ctx) + } }) }) @@ -778,6 +772,13 @@ var _ = Describe("{CreateCloudSnapAndDelete}", func() { }) JustAfterEach(func() { defer EndTorpedoTest() + bucketName, err := GetCloudsnapBucketName(contexts) + log.FailOnError(err, "error getting cloud snap bucket name") + opts := make(map[string]bool) + opts[scheduler.OptionsWaitForResourceLeakCleanup] = true + DestroyApps(contexts, opts) + err = DeleteCloudSnapBucket(bucketName) + log.FailOnError(err, "failed to delete cloud snap bucket") AfterEachTest(contexts) }) }) diff --git a/tests/basic/kubevirt_test.go b/tests/basic/kubevirt_test.go index 83bc274f2..f3bbfd266 100644 --- a/tests/basic/kubevirt_test.go +++ b/tests/basic/kubevirt_test.go @@ -3,8 +3,10 @@ package tests import ( context1 "context" "fmt" + "github.com/portworx/sched-ops/k8s/core" "net/url" "strings" + "sync" "time" apapi "github.com/libopenstorage/autopilot-api/pkg/apis/autopilot/v1alpha1" @@ -28,8 +30,10 @@ var _ = Describe("{AddNewDiskToKubevirtVM}", func() { var namespace string itLog := "Add a new disk to a kubevirtVM" It(itLog, func() { - defer ListEvents("portworx") - namespace = fmt.Sprintf("kubevirt-%v", time.Now().Unix()) + pxNs, err := Inst().V.GetVolumeDriverNamespace() + log.FailOnError(err, "Failed to get volume driver namespace") + defer ListEvents(pxNs) + appList := Inst().AppList defer func() { Inst().AppList = appList @@ -46,6 +50,7 @@ var _ = Describe("{AddNewDiskToKubevirtVM}", func() { stepLog = "schedule a kubevirtVM" Step(stepLog, func() { for i := 0; i < Inst().GlobalScaleFactor; i++ { + namespace = fmt.Sprintf("kubevirt-%v", time.Now().Unix()) appCtxs = append(appCtxs, ScheduleApplicationsOnNamespace(namespace, "test")...) } }) @@ -94,7 +99,10 @@ var _ = Describe("{KubeVirtLiveMigration}", func() { var namespace string itLog := "Live migrate a kubevirtVM" It(itLog, func() { - defer ListEvents("portworx") + pxNs, err := Inst().V.GetVolumeDriverNamespace() + log.FailOnError(err, "Failed to get volume driver namespace") + defer ListEvents(pxNs) + namespace = fmt.Sprintf("kubevirt-%v", time.Now().Unix()) log.InfoD(stepLog) appList := Inst().AppList @@ -144,7 +152,10 @@ var _ = Describe("{PxKillBeforeAddDiskToVM}", func() { var namespace string itLog := "Kill Px then Add disk to Kubevirt VM" It(itLog, func() { - defer ListEvents("portworx") + pxNs, err := Inst().V.GetVolumeDriverNamespace() + log.FailOnError(err, "Failed to get volume driver namespace") + defer ListEvents(pxNs) + namespace = fmt.Sprintf("kubevirt-%v", time.Now().Unix()) appList := Inst().AppList defer func() { @@ -247,7 +258,10 @@ var _ = Describe("{PxKillAfterAddDiskToVM}", func() { itLog := "Add disk to Kubevirt VM, Kill Px and then add another disk" It(itLog, func() { - defer ListEvents("portworx") + pxNs, err := Inst().V.GetVolumeDriverNamespace() + log.FailOnError(err, "Failed to get volume driver namespace") + defer ListEvents(pxNs) + namespace = fmt.Sprintf("kubevirt-%v", time.Now().Unix()) appList := Inst().AppList defer func() { @@ -358,7 +372,10 @@ var _ = Describe("{KubevirtVMVolHaIncrease}", func() { var namespace string itLog := "Increase the volume HA of a kubevirt VM" It(itLog, func() { - defer ListEvents("portworx") + pxNs, err := Inst().V.GetVolumeDriverNamespace() + log.FailOnError(err, "Failed to get volume driver namespace") + defer ListEvents(pxNs) + namespace = fmt.Sprintf("kubevirt-%v", time.Now().Unix()) appList := Inst().AppList defer func() { @@ -430,7 +447,10 @@ var _ = Describe("{KubevirtVMVolHaDecrease}", func() { var namespace string itLog := "Decrease the volume HA of a kubevirt VM" It(itLog, func() { - defer ListEvents("portworx") + pxNs, err := Inst().V.GetVolumeDriverNamespace() + log.FailOnError(err, "Failed to get volume driver namespace") + defer ListEvents(pxNs) + namespace = fmt.Sprintf("kubevirt-%v", time.Now().Unix()) log.InfoD(stepLog) appList := Inst().AppList @@ -506,7 +526,10 @@ var _ = Describe("{LiveMigrationBeforeAddDisk}", func() { var namespace string itLog := "Live Migrate a VM and then add a new disk to a kubevirtVM" It(itLog, func() { - defer ListEvents("portworx") + pxNs, err := Inst().V.GetVolumeDriverNamespace() + log.FailOnError(err, "Failed to get volume driver namespace") + defer ListEvents(pxNs) + namespace = fmt.Sprintf("kubevirt-%v", time.Now().Unix()) appList := Inst().AppList defer func() { @@ -572,7 +595,10 @@ var _ = Describe("{AddDiskAndLiveMigrate}", func() { var namespace string itLog := "Add a new disk to a kubevirtVM and then Live Migrate" It(itLog, func() { - defer ListEvents("portworx") + pxNs, err := Inst().V.GetVolumeDriverNamespace() + log.FailOnError(err, "Failed to get volume driver namespace") + defer ListEvents(pxNs) + namespace = fmt.Sprintf("kubevirt-%v", time.Now().Unix()) appList := Inst().AppList defer func() { @@ -659,7 +685,10 @@ var _ = Describe("{KubeVirtPvcAndPoolExpandWithAutopilot}", func() { }) It("has to fill up the volume completely, resize the volumes and storage pool(s), validate and teardown apps", func() { - defer ListEvents("portworx") + pxNs, err := Inst().V.GetVolumeDriverNamespace() + log.FailOnError(err, "Failed to get volume driver namespace") + defer ListEvents(pxNs) + log.InfoD("filling up the volume completely, resizing the volumes and storage pool(s), validating and tearing down apps") Step("Create autopilot rules for PVC and pool expand", func() { @@ -853,7 +882,10 @@ var _ = Describe("{UpgradeOCPAndValidateKubeVirtApps}", func() { itLog := "Upgrade OCP cluster and validate kubevirt apps" It(itLog, func() { - defer ListEvents("portworx") + pxNs, err := Inst().V.GetVolumeDriverNamespace() + log.FailOnError(err, "Failed to get volume driver namespace") + defer ListEvents(pxNs) + stepLog := "schedule kubevirt VMs" Step(stepLog, func() { for i := 0; i < Inst().GlobalScaleFactor; i++ { @@ -898,7 +930,7 @@ var _ = Describe("{UpgradeOCPAndValidateKubeVirtApps}", func() { dash.VerifyFatal(mError, nil, "validation of PDB of px-storage during cluster upgrade successful") dash.VerifyFatal(err, nil, fmt.Sprintf("verify [%s] upgrade to [%s] is successful", Inst().S.String(), version)) - PrintK8sCluterInfo() + PrintK8sClusterInfo() }) Step("validate storage components", func() { @@ -909,7 +941,7 @@ var _ = Describe("{UpgradeOCPAndValidateKubeVirtApps}", func() { dash.VerifyFatal(err, nil, fmt.Sprintf("verify volume driver after upgrade to %s", version)) // Printing cluster node info after the upgrade - PrintK8sCluterInfo() + PrintK8sClusterInfo() }) Step("update node drive endpoints", func() { @@ -948,7 +980,10 @@ var _ = Describe("{RebootRootDiskAttachedNode}", func() { itLog := "Reboot node where Kubevirt VMs root disk is attached" It(itLog, func() { - defer ListEvents("portworx") + pxNs, err := Inst().V.GetVolumeDriverNamespace() + log.FailOnError(err, "Failed to get volume driver namespace") + defer ListEvents(pxNs) + appList := Inst().AppList defer func() { Inst().AppList = appList @@ -1014,3 +1049,912 @@ var _ = Describe("{RebootRootDiskAttachedNode}", func() { AfterEachTest(appCtxs) }) }) + +var _ = Describe("{ParallelAddDiskToVM}", func() { + JustBeforeEach(func() { + StartTorpedoTest("ParallelAddDiskToVM", "Add a new disk to multiple kubevirtVM parallely", nil, 0) + }) + var appCtxs []*scheduler.Context + var namespace string + var wg sync.WaitGroup + + itLog := "Add a new disk to multiple kubevirtVM" + It(itLog, func() { + pxNs, err := Inst().V.GetVolumeDriverNamespace() + log.FailOnError(err, "Failed to get volume driver namespace") + defer ListEvents(pxNs) + + appList := Inst().AppList + defer func() { + Inst().AppList = appList + }() + numberOfVolumes := 1 + Inst().AppList = []string{"kubevirt-debian-template"} + stepLog := "Setting up Boot PVC Template" + Step(stepLog, func() { + template := ScheduleApplications("template") + ValidateApplications(template) + }) + + Inst().AppList = []string{"kubevirt-debian-fio-minimal"} + stepLog = "schedule a kubevirtVM" + Step(stepLog, func() { + for i := 0; i < Inst().GlobalScaleFactor; i++ { + namespace = fmt.Sprintf("kubevirt-%v", time.Now().Unix()) + appCtxs = append(appCtxs, ScheduleApplicationsOnNamespace(namespace, "test")...) + } + }) + ValidateApplications(appCtxs) + for _, appCtx := range appCtxs { + bindMount, err := IsVMBindMounted(appCtx, false) + log.FailOnError(err, "Failed to verify bind mount") + dash.VerifyFatal(bindMount, true, "Failed to verify bind mount") + } + + stepLog = "Add one disk to multiple kubevirt VM at the same time" + Step(stepLog, func() { + log.InfoD(stepLog) + for _, appCtx := range appCtxs { + wg.Add(1) + go func(appCtx *scheduler.Context) { + defer GinkgoRecover() + defer wg.Done() + _, err := AddDisksToKubevirtVM([]*scheduler.Context{appCtx}, numberOfVolumes, "10Gi") + log.FailOnError(err, "Failed to add disks to kubevirt VM") + dash.VerifyFatal(true, true, "Failed to add disks to kubevirt VM?") + }(appCtx) + } + }) + wg.Wait() + + stepLog = "Verify the new disk added is also bind mounted" + Step(stepLog, func() { + log.InfoD(stepLog) + for _, appCtx := range appCtxs { + isVmBindMounted, err := IsVMBindMounted(appCtx, true) + log.FailOnError(err, "Failed to verify disks in kubevirt VM") + if !isVmBindMounted { + log.Errorf("The newly added disk to vm %s is not bind mounted", appCtx.App.Key) + } + } + }) + stepLog = "Destroy Applications" + Step(stepLog, func() { + log.InfoD(stepLog) + DestroyApps(appCtxs, nil) + }) + }) + JustAfterEach(func() { + defer EndTorpedoTest() + AfterEachTest(appCtxs) + }) +}) + +var _ = Describe("{MultipleKubeVirtLiveMigration}", func() { + JustBeforeEach(func() { + StartTorpedoTest("MultipleKubeVirtLiveMigration", "Live migrate multiple kubevirtVM's parallely", nil, 0) + }) + var appCtxs []*scheduler.Context + var namespace string + var wg sync.WaitGroup + + itLog := "Live migrate multiple kubevirtVM's parallely" + It(itLog, func() { + pxNs, err := Inst().V.GetVolumeDriverNamespace() + log.FailOnError(err, "Failed to get volume driver namespace") + defer ListEvents(pxNs) + + log.InfoD(stepLog) + appList := Inst().AppList + defer func() { + Inst().AppList = appList + }() + Inst().AppList = []string{"kubevirt-debian-fio-minimal"} + stepLog := "schedule a kubevirt VM" + Step(stepLog, func() { + for i := 0; i < Inst().GlobalScaleFactor; i++ { + namespace = fmt.Sprintf("kubevirt-%v", time.Now().Unix()) + appCtxs = append(appCtxs, ScheduleApplicationsOnNamespace(namespace, "test")...) + } + }) + ValidateApplications(appCtxs) + for _, appCtx := range appCtxs { + bindMount, err := IsVMBindMounted(appCtx, false) + log.FailOnError(err, "Failed to verify bind mount") + dash.VerifyFatal(bindMount, true, "Failed to verify bind mount") + } + stepLog = "Live migrate the kubevirt VM" + Step(stepLog, func() { + log.InfoD(stepLog) + for _, appCtx := range appCtxs { + wg.Add(1) + go func(appCtx *scheduler.Context) { + defer GinkgoRecover() + defer wg.Done() + err := StartAndWaitForVMIMigration(appCtx, context1.TODO()) + log.FailOnError(err, "Failed to live migrate kubevirt VM") + }(appCtx) + } + }) + wg.Wait() + + stepLog = "Destroy Applications" + Step(stepLog, func() { + log.InfoD(stepLog) + DestroyApps(appCtxs, nil) + }) + }) + JustAfterEach(func() { + defer EndTorpedoTest() + AfterEachTest(appCtxs) + }) +}) + +var _ = Describe("{AddDiskAndLiveMigrateMultipleVm}", func() { + JustBeforeEach(func() { + StartTorpedoTest("AddDiskAndLiveMigrateMultipleVm", "Live Migrate multiple VM's After Adding a new disk to a kubevirtVM", nil, 0) + }) + var appCtxs []*scheduler.Context + var namespace string + var wg sync.WaitGroup + + itLog := "Add a new disk to multiple kubevirtVM and then Live Migrate them parallely" + It(itLog, func() { + pxNs, err := Inst().V.GetVolumeDriverNamespace() + log.FailOnError(err, "Failed to get volume driver namespace") + defer ListEvents(pxNs) + + appList := Inst().AppList + defer func() { + Inst().AppList = appList + }() + numberOfVolumes := 1 + Inst().AppList = []string{"kubevirt-debian-fio-minimal"} + stepLog := "schedule a kubevirtVM" + Step(stepLog, func() { + for i := 0; i < Inst().GlobalScaleFactor; i++ { + namespace = fmt.Sprintf("kubevirt-%v", time.Now().Unix()) + appCtxs = append(appCtxs, ScheduleApplicationsOnNamespace(namespace, "test")...) + } + }) + ValidateApplications(appCtxs) + for _, appCtx := range appCtxs { + bindMount, err := IsVMBindMounted(appCtx, false) + log.FailOnError(err, "Failed to verify bind mount") + dash.VerifyFatal(bindMount, true, "Failed to verify bind mount") + } + + stepLog = "Add one disk to the kubevirt VM's and check if new added disk is bind mounted and live migrate the vms parallely" + Step(stepLog, func() { + log.InfoD(stepLog) + for _, appCtx := range appCtxs { + wg.Add(1) + go func(appCtx *scheduler.Context) { + defer GinkgoRecover() + defer wg.Done() + + success, err := AddDisksToKubevirtVM([]*scheduler.Context{appCtx}, numberOfVolumes, "10Gi") + log.FailOnError(err, "Failed to add disks to kubevirt VM") + dash.VerifyFatal(success, true, "Failed to add disks to kubevirt VM?") + + isVmBindMounted, err := IsVMBindMounted(appCtx, true) + log.FailOnError(err, "Failed to verify disks in kubevirt VM") + if !isVmBindMounted { + log.Errorf("The newly added disk to vm %s is not bind mounted", appCtx.App.Key) + } + err = StartAndWaitForVMIMigration(appCtx, context1.TODO()) + log.FailOnError(err, "Failed to live migrate kubevirt VM") + }(appCtx) + } + }) + wg.Wait() + + stepLog = "Destroy Applications" + Step(stepLog, func() { + log.InfoD(stepLog) + DestroyApps(appCtxs, nil) + }) + }) + JustAfterEach(func() { + defer EndTorpedoTest() + AfterEachTest(appCtxs) + }) +}) + +var _ = Describe("{LiveMigrationBeforeAddDiskMultipleVm}", func() { + JustBeforeEach(func() { + StartTorpedoTest("LiveMigrationBeforeAddDiskMultipleVm", "Live Migrate multiple VM's Before Adding a new disk to a kubevirtVM parallely", nil, 0) + }) + var appCtxs []*scheduler.Context + var namespace string + var wg sync.WaitGroup + + itLog := "Live Migrate multiple VM's and then add a new disk to a kubevirtVM" + It(itLog, func() { + pxNs, err := Inst().V.GetVolumeDriverNamespace() + log.FailOnError(err, "Failed to get volume driver namespace") + defer ListEvents(pxNs) + + appList := Inst().AppList + defer func() { + Inst().AppList = appList + }() + numberOfVolumes := 1 + Inst().AppList = []string{"kubevirt-debian-fio-minimal"} + stepLog := "schedule a kubevirtVM" + Step(stepLog, func() { + for i := 0; i < Inst().GlobalScaleFactor; i++ { + namespace = fmt.Sprintf("kubevirt-%v", time.Now().Unix()) + appCtxs = append(appCtxs, ScheduleApplicationsOnNamespace(namespace, "test")...) + } + }) + ValidateApplications(appCtxs) + for _, appCtx := range appCtxs { + bindMount, err := IsVMBindMounted(appCtx, false) + log.FailOnError(err, "Failed to verify bind mount") + dash.VerifyFatal(bindMount, true, "Failed to verify bind mount") + } + stepLog = "Live migrate the kubevirt VM's,Add one disk to the kubevirt VM and verify the new disk added is also bind mounted" + Step(stepLog, func() { + log.InfoD(stepLog) + for _, appCtx := range appCtxs { + wg.Add(1) + go func(appCtx *scheduler.Context) { + defer GinkgoRecover() + defer wg.Done() + err := StartAndWaitForVMIMigration(appCtx, context1.TODO()) + log.FailOnError(err, "Failed to live migrate kubevirt VM") + + success, err := AddDisksToKubevirtVM([]*scheduler.Context{appCtx}, numberOfVolumes, "10Gi") + log.FailOnError(err, "Failed to add disks to kubevirt VM") + dash.VerifyFatal(success, true, "Failed to add disks to kubevirt VM?") + + isVmBindMounted, err := IsVMBindMounted(appCtx, true) + log.FailOnError(err, "Failed to verify disks in kubevirt VM") + if !isVmBindMounted { + log.Errorf("The newly added disk to vm %s is not bind mounted", appCtx.App.Key) + } + }(appCtx) + } + }) + stepLog = "Destroy Applications" + Step(stepLog, func() { + log.InfoD(stepLog) + DestroyApps(appCtxs, nil) + }) + }) + JustAfterEach(func() { + defer EndTorpedoTest() + AfterEachTest(appCtxs) + }) +}) + +var _ = Describe("{MultipleVMVolHaIncrease}", func() { + JustBeforeEach(func() { + StartTorpedoTest("MultipleVMVolHaIncrease", "Increase the volume HA of multiple kubevirt VM parallely", nil, 0) + }) + var appCtxs []*scheduler.Context + var namespace string + var wg sync.WaitGroup + + itLog := "Increase the volume HA of multiple kubevirt VM parallely" + It(itLog, func() { + pxNs, err := Inst().V.GetVolumeDriverNamespace() + log.FailOnError(err, "Failed to get volume driver namespace") + defer ListEvents(pxNs) + + appList := Inst().AppList + defer func() { + Inst().AppList = appList + }() + Inst().AppList = []string{"kubevirt-debian-fio-low-ha"} + stepLog := "schedule a kubevirt VM" + Step(stepLog, func() { + for i := 0; i < Inst().GlobalScaleFactor; i++ { + namespace = fmt.Sprintf("kubevirt-%v", time.Now().Unix()) + appCtxs = append(appCtxs, ScheduleApplicationsOnNamespace(namespace, "test")...) + } + }) + ValidateApplications(appCtxs) + for _, appCtx := range appCtxs { + bindMount, err := IsVMBindMounted(appCtx, false) + log.FailOnError(err, "Failed to verify bind mount") + dash.VerifyFatal(bindMount, true, "Failed to verify bind mount") + } + stepLog = "Increase the volume HA of the multiple kubevirt VM Volumes and check if they are bind mounted parallely" + Step(stepLog, func() { + log.InfoD(stepLog) + for _, appCtx := range appCtxs { + wg.Add(1) + go func(appCtx *scheduler.Context) { + defer GinkgoRecover() + defer wg.Done() + vols, err := Inst().S.GetVolumes(appCtx) + log.FailOnError(err, "Failed to get volumes of kubevirt VM") + for _, vol := range vols { + currRep, err := Inst().V.GetReplicationFactor(vol) + log.FailOnError(err, "Failed to get Repl factor for vil %s", vol.Name) + + if currRep < 3 { + opts := volume.Options{ + ValidateReplicationUpdateTimeout: validateReplicationUpdateTimeout, + } + err = Inst().V.SetReplicationFactor(vol, currRep+1, nil, nil, true, opts) + dash.VerifyFatal(err, nil, fmt.Sprintf("Validate set repl factor to %d", currRep+1)) + } else { + log.Warnf("Volume %s has reached maximum replication factor", vol.Name) + } + } + isVmBindMounted, err := IsVMBindMounted(appCtx, true) + log.FailOnError(err, "Failed to run vm bind mount check") + if !isVmBindMounted { + log.Errorf("The newly added replication to vm %s is not bind mounted", appCtx.App.Key) + } + }(appCtx) + } + }) + + wg.Wait() + stepLog = "Destroy Applications" + Step(stepLog, func() { + log.InfoD(stepLog) + DestroyApps(appCtxs, nil) + }) + }) + JustAfterEach(func() { + defer EndTorpedoTest() + AfterEachTest(appCtxs) + }) +}) + +var _ = Describe("{MultipleVMVolHaDecrease}", func() { + JustBeforeEach(func() { + StartTorpedoTest("MultipleVMVolHaDecrease", "Decrease the replication factor of multiple kubevirt Vms paralley", nil, 0) + }) + var appCtxs []*scheduler.Context + var namespace string + var wg sync.WaitGroup + + itLog := "Decrease the replication factor of multiple kubevirt Vms paralley" + It(itLog, func() { + pxNs, err := Inst().V.GetVolumeDriverNamespace() + log.FailOnError(err, "Failed to get volume driver namespace") + defer ListEvents(pxNs) + + namespace = fmt.Sprintf("kubevirt-%v", time.Now().Unix()) + log.InfoD(stepLog) + appList := Inst().AppList + defer func() { + Inst().AppList = appList + }() + + Inst().AppList = []string{"kubevirt-debian-fio-minimal"} + stepLog := "schedule a kubevirt VM" + Step(stepLog, func() { + log.InfoD(stepLog) + for i := 0; i < Inst().GlobalScaleFactor; i++ { + namespace = fmt.Sprintf("kubevirt-%v", time.Now().Unix()) + appCtxs = append(appCtxs, ScheduleApplicationsOnNamespace(namespace, "test")...) + } + }) + ValidateApplications(appCtxs) + for _, appCtx := range appCtxs { + bindMount, err := IsVMBindMounted(appCtx, false) + log.FailOnError(err, "Failed to verify bind mount") + dash.VerifyFatal(bindMount, true, "Failed to verify bind mount") + } + + stepLog = "Decrease the volume HA of the multiple kubevirt VM Volumes and check if they are bind mounted" + Step(stepLog, func() { + log.InfoD(stepLog) + for _, appCtx := range appCtxs { + go func(appCtx *scheduler.Context) { + defer GinkgoRecover() + defer wg.Done() + vols, err := Inst().S.GetVolumes(appCtx) + log.FailOnError(err, "Failed to get volumes of kubevirt VM") + for _, vol := range vols { + currRep, err := Inst().V.GetReplicationFactor(vol) + log.FailOnError(err, "Failed to get Repl factor for vil %s", vol.Name) + + if currRep > 1 { + opts := volume.Options{ + ValidateReplicationUpdateTimeout: validateReplicationUpdateTimeout, + } + err = Inst().V.SetReplicationFactor(vol, currRep-1, nil, nil, true, opts) + dash.VerifyFatal(err, nil, fmt.Sprintf("Validate set repl factor to %d", currRep-1)) + } else { + log.Warnf("Volume %s has reached maximum replication factor", vol.Name) + } + } + isVmBindMounted, err := IsVMBindMounted(appCtx, true) + log.FailOnError(err, "Failed to run vm bind mount check") + if !isVmBindMounted { + log.Errorf("The newly added disk to vm %s is not bind mounted", appCtx.App.Key) + } + }(appCtx) + } + wg.Wait() + }) + + stepLog = "Destroy Applications" + Step(stepLog, func() { + log.InfoD(stepLog) + DestroyApps(appCtxs, nil) + }) + }) + JustAfterEach(func() { + defer EndTorpedoTest() + AfterEachTest(appCtxs) + }) +}) + +var _ = Describe("{LiveMigrateWhileNodeInMaintenance}", func() { + /* + 1. Put replica nodes in maintenance mode + 2. Initiate Live Migration of VM + 3. Verify VM is migrated to different node + 4. Exit maintenance mode of the node + + */ + + JustBeforeEach(func() { + StartTorpedoTest("LiveMigrateWhileNodeInMaintenance", "Live Migrate VM while node is in maintenance mode", nil, 0) + + }) + + var appCtxs []*scheduler.Context + var wg sync.WaitGroup + + itLog := "Live Migrate VM while replica nodes are in maintenance mode" + It(itLog, func() { + log.InfoD(itLog) + pxNs, err := Inst().V.GetVolumeDriverNamespace() + log.FailOnError(err, "Failed to get volume driver namespace") + defer ListEvents(pxNs) + + namespace := fmt.Sprintf("kubevirt-%v", time.Now().Unix()) + log.InfoD(stepLog) + appList := Inst().AppList + defer func() { + Inst().AppList = appList + }() + Inst().AppList = []string{"kubevirt-debian-fio-minimal"} + stepLog := "schedule a kubevirt VM" + Step(stepLog, func() { + for i := 0; i < Inst().GlobalScaleFactor; i++ { + taskName := fmt.Sprintf("test-%v", i) + appCtxs = append(appCtxs, ScheduleApplicationsOnNamespace(namespace, taskName)...) + } + ValidateApplications(appCtxs) + for _, appCtx := range appCtxs { + bindMount, err := IsVMBindMounted(appCtx, false) + log.FailOnError(err, "Failed to verify bind mount") + dash.VerifyFatal(bindMount, true, "Failed to verify bind mount") + } + }) + + stepLog = "Put replica nodes in maintenance mode and Live migrate the kubevirt VM" + Step(stepLog, func() { + log.InfoD(stepLog) + for _, appCtx := range appCtxs { + ReplicaNodes, err := GetReplicaNodesOfVM(appCtx) + log.FailOnError(err, "Failed to get non replica nodes of VM") + + vms, err := GetAllVMsFromScheduledContexts([]*scheduler.Context{appCtx}) + + for _, vm := range vms { + nodeVMProvisionedOn, err := GetNodeOfVM(vm) + log.InfoD("Node VM provisioned on: %s", nodeVMProvisionedOn) + defer func() { + var wg sync.WaitGroup + for _, ReplicaNode := range ReplicaNodes { + if nodeVMProvisionedOn != ReplicaNode { + wg.Add(1) + go func(nonReplicaNode string) { + defer wg.Done() + n, err := node.GetNodeByName(nonReplicaNode) + err = Inst().V.ExitMaintenance(n) + log.FailOnError(err, "Failed to exit node: %s from maintenance mode", nonReplicaNode) + log.Infof("Succesfully exited node: %s from maintenance mode", nonReplicaNode) + }(ReplicaNode) + } + } + wg.Wait() + }() + + for _, ReplicaNode := range ReplicaNodes { + if nodeVMProvisionedOn != ReplicaNode { + wg.Add(1) + go func(nonReplicaNode string) { + defer wg.Done() + n, err := node.GetNodeByName(nonReplicaNode) + err = Inst().V.EnterMaintenance(n) + log.FailOnError(err, "Failed to put node: %s in maintenance mode", nonReplicaNode) + log.Infof("Succesfully put node: %s in maintenance mode", nonReplicaNode) + }(ReplicaNode) + } + } + wg.Wait() + err = StartAndWaitForVMIMigration(appCtx, context1.TODO()) + log.FailOnError(err, "Failed to live migrate kubevirt VM") + } + } + }) + + stepLog = "Destroy Applications" + Step(stepLog, func() { + log.InfoD(stepLog) + DestroyApps(appCtxs, nil) + }) + }) + + JustAfterEach(func() { + defer EndTorpedoTest() + AfterEachTest(appCtxs) + }) +}) + +var _ = Describe("{LiveMigrateCordonNonReplicaNode}", func() { + + /* + 1. Schedule a kubevirt VM + 2. Cordon the non replica nodes + 3. Put the replica nodes on maintenance mode + 4. initiate Live Migration of VM + 5. Verify VM is migrated to different node + 6. Exit maintenance mode + 7. Put the replica node on maintenance mode and again initiate live migration of VM + 8. Verify VM is migrated to different node + 9. Uncordon the nodes + + */ + + JustBeforeEach(func() { + StartTorpedoTest("LiveMigrateCordonNonReplicaNode", "Live Migrate VM while node is in maintenance mode", nil, 0) + }) + + var appCtxs []*scheduler.Context + var wg sync.WaitGroup + + itLog := "Live Migrate VM while node is in maintenance mode" + It(itLog, func() { + log.InfoD(itLog) + namespace := fmt.Sprintf("kubevirt-%v", time.Now().Unix()) + log.InfoD(stepLog) + appList := Inst().AppList + defer func() { + Inst().AppList = appList + }() + Inst().AppList = []string{"kubevirt-debian-fio-minimal"} + stepLog := "schedule a kubevirt VM" + Step(stepLog, func() { + for i := 0; i < Inst().GlobalScaleFactor; i++ { + taskName := fmt.Sprintf("test-%v", i) + appCtxs = append(appCtxs, ScheduleApplicationsOnNamespace(namespace, taskName)...) + } + }) + stepLog = "Check if vm is bind mount" + Step(stepLog, func() { + log.InfoD(stepLog) + for _, appCtx := range appCtxs { + bindMount, err := IsVMBindMounted(appCtx, false) + log.FailOnError(err, "Failed to verify bind mount") + dash.VerifyFatal(bindMount, true, "Failed to verify bind mount") + } + }) + + for _, appCtx := range appCtxs { + nonReplicaNodes, err := GetNonReplicaNodesOfVM(appCtx) + log.FailOnError(err, "Failed to get non replica nodes of VM") + + defer func() { + //Uncordon the nodes + for _, nonReplicaNode := range nonReplicaNodes { + err = core.Instance().UnCordonNode(nonReplicaNode, defaultCommandTimeout, defaultCommandRetry) + log.FailOnError(err, "Failed to uncordon the node") + } + }() + // cordon the non replica nodes + for _, nonReplicaNode := range nonReplicaNodes { + err = core.Instance().CordonNode(nonReplicaNode, defaultCommandTimeout, defaultCommandRetry) + log.FailOnError(err, "Failed to cordon the node") + } + + vms, err := GetAllVMsFromScheduledContexts([]*scheduler.Context{appCtx}) + log.FailOnError(err, "Failed to get VMs from scheduled contexts") + dash.VerifyFatal(len(vms) > 0, true, "Failed to get VMs from scheduled contexts") + + for _, vm := range vms { + //Put the node on maintenance mode where VM is provisioned + stepLog = "Put the replica nodes on maintenance mode and live migrate the VM" + Step(stepLog, func() { + log.InfoD(stepLog) + nodeVMProvisionedOn, err := GetNodeOfVM(vm) + log.InfoD("Node VM provisioned on: %s", nodeVMProvisionedOn) + defer func() { + var wg sync.WaitGroup + for _, nonReplicaNode := range nonReplicaNodes { + if nodeVMProvisionedOn != nonReplicaNode { + wg.Add(1) + go func(nonReplicaNode string) { + defer wg.Done() + n, err := node.GetNodeByName(nonReplicaNode) + err = Inst().V.ExitMaintenance(n) + log.FailOnError(err, "Failed to exit node: %s from maintenance mode", nonReplicaNode) + log.Infof("Succesfully exited node: %s from maintenance mode", nonReplicaNode) + }(nonReplicaNode) + } + } + wg.Wait() + }() + + for _, nonReplicaNode := range nonReplicaNodes { + if nodeVMProvisionedOn != nonReplicaNode { + wg.Add(1) + go func(nonReplicaNode string) { + defer wg.Done() + n, err := node.GetNodeByName(nonReplicaNode) + err = Inst().V.EnterMaintenance(n) + log.FailOnError(err, "Failed to put node: %s in maintenance mode", nonReplicaNode) + log.Infof("Succesfully put node: %s in maintenance mode", nonReplicaNode) + }(nonReplicaNode) + } + } + wg.Wait() + err = StartAndWaitForVMIMigration(appCtx, context1.TODO()) + log.FailOnError(err, "Failed to live migrate kubevirt VM") + }) + + //Put the node on maintenance mode and again initiate live migration of VM + stepLog = "Put the replica nodes on maintenance mode and again initiate live migration of VM" + Step(stepLog, func() { + log.InfoD(stepLog) + nodeVMProvisionedOn, err := GetNodeOfVM(vm) + log.InfoD("Node VM provisioned on: %s", nodeVMProvisionedOn) + defer func() { + var wg sync.WaitGroup + for _, nonReplicaNode := range nonReplicaNodes { + if nodeVMProvisionedOn != nonReplicaNode { + wg.Add(1) + go func(nonReplicaNode string) { + defer wg.Done() + n, err := node.GetNodeByName(nonReplicaNode) + err = Inst().V.ExitMaintenance(n) + log.FailOnError(err, "Failed to exit node: %s from maintenance mode", nonReplicaNode) + log.Infof("Succesfully exited node: %s from maintenance mode", nonReplicaNode) + }(nonReplicaNode) + } + } + wg.Wait() + }() + + for _, nonReplicaNode := range nonReplicaNodes { + if nodeVMProvisionedOn != nonReplicaNode { + wg.Add(1) + go func(nonReplicaNode string) { + defer wg.Done() + n, err := node.GetNodeByName(nonReplicaNode) + err = Inst().V.EnterMaintenance(n) + log.FailOnError(err, "Failed to put node: %s in maintenance mode", nonReplicaNode) + log.Infof("Succesfully put node: %s in maintenance mode", nonReplicaNode) + }(nonReplicaNode) + } + } + wg.Wait() + err = StartAndWaitForVMIMigration(appCtx, context1.TODO()) + log.FailOnError(err, "Failed to live migrate kubevirt VM") + }) + } + } + }) + + JustAfterEach(func() { + defer EndTorpedoTest() + AfterEachTest(appCtxs) + }) + +}) + +var _ = Describe("{StopPxOnNodeWhereVMIsProvisioned}", func() { + /* + 1. Schedule a kubevirt VM + ` 2. Stop PX on the node where VM is provisioned for 15mins + 3. Start PX on the node where VM is provisioned + 4. Verify VM is running fine + + https://portworx.testrail.net/index.php?/cases/view/296893 + + */ + + JustBeforeEach(func() { + StartTorpedoTest("StopPxOnNodeWhereVMIsProvisioned", "Stop PX on node where VM is provisioned", nil, 296893) + }) + + var appCtxs []*scheduler.Context + + itLog := "Stop PX on node where VM is provisioned" + It(itLog, func() { + log.InfoD(itLog) + pxNs, err := Inst().V.GetVolumeDriverNamespace() + log.FailOnError(err, "Failed to get volume driver namespace") + defer ListEvents(pxNs) + + appList := Inst().AppList + defer func() { + Inst().AppList = appList + }() + Inst().AppList = []string{"kubevirt-debian-fio-minimal"} + + stepLog := "schedule a kubevirt VM" + Step(stepLog, func() { + for i := 0; i < Inst().GlobalScaleFactor; i++ { + test := fmt.Sprintf("test-%v", time.Now().Unix()) + appCtxs = append(appCtxs, ScheduleApplications(test)...) + } + ValidateApplications(appCtxs) + for _, appCtx := range appCtxs { + bindMount, err := IsVMBindMounted(appCtx, false) + log.FailOnError(err, "Failed to verify bind mount") + dash.VerifyFatal(bindMount, true, "Failed to verify bind mount") + } + }) + + for _, appCtx := range appCtxs { + vms, err := GetAllVMsFromScheduledContexts([]*scheduler.Context{appCtx}) + log.FailOnError(err, "Failed to get VMs from scheduled contexts") + dash.VerifyFatal(len(vms) > 0, true, "Failed to get VMs from scheduled contexts") + for _, vm := range vms { + nodeName, err := GetNodeOfVM(vm) + log.FailOnError(err, "Failed to get node name for VM: %s", vm.Name) + nodeObj, err := node.GetNodeByName(nodeName) + log.FailOnError(err, "Failed to get node obj for node name: %s", nodeName) + stepLog = "Stop PX on the node where VM is provisioned for 15 mins" + Step(stepLog, func() { + log.InfoD(stepLog) + err := Inst().V.StopDriver([]node.Node{nodeObj}, false, nil) + log.FailOnError(err, "Failed to stop PX on the node: %s", nodeObj.Name) + log.Infof("Succesfully stopped PX on the node: %s", nodeObj.Name) + time.Sleep(15 * time.Minute) + }) + + stepLog = "Start PX on the node where VM is provisioned" + Step(stepLog, func() { + log.InfoD(stepLog) + err := Inst().V.StartDriver(nodeObj) + log.FailOnError(err, "Failed to start PX on the node: %s", nodeObj.Name) + log.Infof("Succesfully started PX on the node: %s", nodeObj.Name) + }) + } + } + + stepLog = "Validate vm after stopping and starting px" + Step(stepLog, func() { + log.InfoD(stepLog) + ValidateApplications(appCtxs) + for _, appCtx := range appCtxs { + bindMount, err := IsVMBindMounted(appCtx, false) + log.FailOnError(err, "Failed to verify bind mount") + dash.VerifyFatal(bindMount, true, "Failed to verify bind mount") + } + }) + + }) + + JustAfterEach(func() { + defer EndTorpedoTest() + AfterEachTest(appCtxs) + }) +}) + +var _ = Describe("{RestartPXAndCheckIfVmBindMount}", func() { + + /* + 1. Schedule a kubevirt VM + 2. Cordon the non replica nodes + 3. initiate Live Migration of VM + 4. Verify VM is migrated to different node + 5. Restart portworx on the node where VM was provisioned + 6. The volume now should be locally attached to the node where the vm has been migrated + 7. Uncordon the nodes + */ + + JustBeforeEach(func() { + StartTorpedoTest("RestartPXAndCheckIfVmBindMount", "Restart PX and check if VM is bind mounted", nil, 0) + + }) + + var appCtxs []*scheduler.Context + + itLog := "Live migrate,Restart PX and check if VM is bind mounted" + It(itLog, func() { + log.InfoD(itLog) + namespace := fmt.Sprintf("kubevirt-%v", time.Now().Unix()) + log.InfoD(stepLog) + appList := Inst().AppList + defer func() { + Inst().AppList = appList + }() + Inst().AppList = []string{"kubevirt-debian-fio-minimal"} + stepLog := "schedule a kubevirt VM" + Step(stepLog, func() { + for i := 0; i < Inst().GlobalScaleFactor; i++ { + taskName := fmt.Sprintf("test-%v", i) + appCtxs = append(appCtxs, ScheduleApplicationsOnNamespace(namespace, taskName)...) + } + }) + stepLog = "Check if vm is bind mount" + Step(stepLog, func() { + log.InfoD(stepLog) + for _, appCtx := range appCtxs { + bindMount, err := IsVMBindMounted(appCtx, false) + log.FailOnError(err, "Failed to verify bind mount") + dash.VerifyFatal(bindMount, true, "Failed to verify bind mount") + } + }) + + for _, appCtx := range appCtxs { + nonReplicaNodes, err := GetNonReplicaNodesOfVM(appCtx) + log.FailOnError(err, "Failed to get non replica nodes of VM") + + defer func() { + //Uncordon the nodes + for _, nonReplicaNode := range nonReplicaNodes { + err = core.Instance().UnCordonNode(nonReplicaNode, defaultCommandTimeout, defaultCommandRetry) + log.FailOnError(err, "Failed to uncordon the node") + } + }() + // cordon the non replica nodes + for _, nonReplicaNode := range nonReplicaNodes { + err = core.Instance().CordonNode(nonReplicaNode, defaultCommandTimeout, defaultCommandRetry) + log.FailOnError(err, "Failed to cordon the node") + } + + vms, err := GetAllVMsFromScheduledContexts([]*scheduler.Context{appCtx}) + log.FailOnError(err, "Failed to get VMs from scheduled contexts") + dash.VerifyFatal(len(vms) > 0, true, "Failed to get VMs from scheduled contexts") + + for _, vm := range vms { + nodeVMProvisionedOn, err := GetNodeOfVM(vm) + log.FailOnError(err, "Failed to get node name for VM: %s", vm.Name) + log.InfoD("Node VM provisioned on: %s", nodeVMProvisionedOn) + + nodeObj, err := node.GetNodeByName(nodeVMProvisionedOn) + log.FailOnError(err, "Failed to get node obj for node name: %s", nodeVMProvisionedOn) + + stepLog = "live migrate the VM" + Step(stepLog, func() { + log.InfoD(stepLog) + err = StartAndWaitForVMIMigration(appCtx, context1.TODO()) + log.FailOnError(err, "Failed to live migrate kubevirt VM") + }) + + stepLog = "Restart the PX on the node where VM was provisioned" + Step(stepLog, func() { + log.InfoD(stepLog) + StopVolDriverAndWait([]node.Node{nodeObj}) + StartVolDriverAndWait([]node.Node{nodeObj}) + log.InfoD("Succesfully restarted PX on the node: %s", nodeObj.Name) + }) + + stepLog = "After restart of the px on previously provisioned node the volume should be locally attached to the node where the vm has been migrated" + Step(stepLog, func() { + log.InfoD(stepLog) + isVmBindMounted, err := IsVMBindMounted(appCtx, true) + log.FailOnError(err, "Failed to run vm bind mount check") + dash.VerifyFatal(isVmBindMounted, true, "Failed to verify bind mount?") + }) + } + stepLog = "Destroy the applications" + Step(stepLog, func() { + log.InfoD(stepLog) + DestroyApps([]*scheduler.Context{appCtx}, nil) + }) + } + }) + + JustAfterEach(func() { + defer EndTorpedoTest() + AfterEachTest(appCtxs) + }) +}) diff --git a/tests/basic/legacy_shared_sharedv4_service_migration_test.go b/tests/basic/legacy_shared_sharedv4_service_migration_test.go index c4ec59226..a934c0534 100644 --- a/tests/basic/legacy_shared_sharedv4_service_migration_test.go +++ b/tests/basic/legacy_shared_sharedv4_service_migration_test.go @@ -90,8 +90,17 @@ func setMigrateLegacySharedToSharedv4Service(on bool) { func getLegacySharedVolumeCount(contexts []*scheduler.Context) int { count := 0 for _, ctx := range contexts { - vols, err := Inst().S.GetVolumes(ctx) - log.FailOnError(err, "error geting volumes used by app") + var vols []*volume.Volume + var err error + t := func() (interface{}, bool , error) { + vols, err = Inst().S.GetVolumes(ctx) + if err != nil { + return "", true, err + } + return "", false, nil + } + _, err = task.DoRetryWithTimeout(t, 5 * time.Minute, 10 * time.Second) + log.FailOnError(err, "Failed to get volumes for app %s", ctx.App.Key) for _, v := range vols { vol, err := Inst().V.InspectVolume(v.ID) log.FailOnError(err, "Failed to inspect volume %v", v.ID) @@ -389,11 +398,12 @@ var _ = Describe("{LegacySharedToSharedv4ServiceMigrationRestart}", func() { for _, ctx := range contexts { returnMapOfPodsUsingApiSharedVolumes(podMap, volMap, ctx) } - setMigrateLegacySharedToSharedv4Service(true) - time.Sleep(210 * time.Second) // sleep 3.5 minutes. totalSharedVolumes := getLegacySharedVolumeCount(contexts) timeForMigration := ((totalSharedVolumes + 30) / 30) * 10 + setMigrateLegacySharedToSharedv4Service(true) + time.Sleep(210 * time.Second) // sleep 3.5 minutes. + stepLog := "Pause Migration and let all Apps come up and restart Migration" Step(stepLog, func() { setMigrateLegacySharedToSharedv4Service(false) @@ -446,6 +456,9 @@ var _ = Describe("{LegacySharedToSharedv4ServicePxRestart}", func() { for _, ctx := range contexts { returnMapOfPodsUsingApiSharedVolumes(podMap, volMap, ctx) } + totalSharedVolumes := getLegacySharedVolumeCount(contexts) + timeForMigration := ((totalSharedVolumes + 30) / 30) * 10 + setMigrateLegacySharedToSharedv4Service(true) time.Sleep(210 * time.Second) // sleep 3.5 minutes. @@ -460,8 +473,6 @@ var _ = Describe("{LegacySharedToSharedv4ServicePxRestart}", func() { log.FailOnError(err, fmt.Sprintf("Driver is down on node %s", pxNode.Name)) }) - totalSharedVolumes := getLegacySharedVolumeCount(contexts) - timeForMigration := ((totalSharedVolumes + 30) / 30) * 10 waitAllSharedVolumesToGetMigrated(contexts, timeForMigration) countPostTimeout := getLegacySharedVolumeCount(contexts) dash.VerifyFatal(countPostTimeout == 0, true, fmt.Sprintf("Post migration count is [%d] instead of 0", countPostTimeout)) @@ -516,6 +527,8 @@ var _ = Describe("{LegacySharedToSharedv4ServiceNodeDecommission}", func() { log.FailOnError(err, fmt.Sprintf("error in executing prereq for node %s decommission", pxNode.Name)) // Transition after preparing for decommission. + totalSharedVolumes := getLegacySharedVolumeCount(contexts) + timeForMigration := ((totalSharedVolumes + 30) / 30) * 10 setMigrateLegacySharedToSharedv4Service(true) time.Sleep(90 * time.Second) // sleep 1.5 minute. @@ -530,8 +543,6 @@ var _ = Describe("{LegacySharedToSharedv4ServiceNodeDecommission}", func() { stepLog = "Validate migration process after node Decommission" Step(stepLog, func() { - totalSharedVolumes := getLegacySharedVolumeCount(contexts) - timeForMigration := ((totalSharedVolumes + 30) / 30) * 10 waitAllSharedVolumesToGetMigrated(contexts, timeForMigration) countPostTimeout := getLegacySharedVolumeCount(contexts) dash.VerifyFatal(countPostTimeout == 0, true, fmt.Sprintf("Post migration count is [%d] instead of 0", countPostTimeout)) @@ -627,6 +638,9 @@ var _ = Describe("{LegacySharedToSharedv4ServiceRestartCoordinator}", func() { break } } + totalSharedVolumes := getLegacySharedVolumeCount(contexts) + timeForMigration := ((totalSharedVolumes + 30) / 30) * 10 + setMigrateLegacySharedToSharedv4Service(true) time.Sleep(120 * time.Second) // sleep 2 minutes. @@ -638,8 +652,6 @@ var _ = Describe("{LegacySharedToSharedv4ServiceRestartCoordinator}", func() { log.FailOnError(err, fmt.Sprintf("Driver is down on node %s", nodeForPxRestart.Name)) }) - totalSharedVolumes := getLegacySharedVolumeCount(contexts) - timeForMigration := ((totalSharedVolumes + 30) / 30) * 10 waitAllSharedVolumesToGetMigrated(contexts, timeForMigration) countPostTimeout := getLegacySharedVolumeCount(contexts) dash.VerifyFatal(countPostTimeout == 0, true, fmt.Sprintf("Post migration count is [%d] instead of 0", countPostTimeout)) @@ -685,13 +697,13 @@ var _ = Describe("{LegacySharedToSharedv4ServiceCreateSnapshotsClones}", func() returnMapOfPodsUsingApiSharedVolumes(podMap, volMap, ctx) } createSnapshotsAndClones(volMap, "snapshot-1", "clone-1") + totalSharedVolumes := getLegacySharedVolumeCount(contexts) + timeForMigration := ((totalSharedVolumes + 30) / 30) * 10 setMigrateLegacySharedToSharedv4Service(true) time.Sleep(120 * time.Second) // sleep 2 minutes. createSnapshotsAndClones(volMap, "snapshot-2", "clone-2") - totalSharedVolumes := getLegacySharedVolumeCount(contexts) - timeForMigration := ((totalSharedVolumes + 30) / 30) * 10 waitAllSharedVolumesToGetMigrated(contexts, timeForMigration) countPostTimeout := getLegacySharedVolumeCount(contexts) dash.VerifyFatal(countPostTimeout == 0, true, fmt.Sprintf("Post migration count is [%d] instead of 0", countPostTimeout)) @@ -801,6 +813,8 @@ var _ = Describe("{LegacySharedToSharedv4ServicePxKill}", func() { for _, ctx := range contexts { returnMapOfPodsUsingApiSharedVolumes(podMap, volMap, ctx) } + totalSharedVolumes := getLegacySharedVolumeCount(contexts) + timeForMigration := ((totalSharedVolumes + 30) / 30) * 10 setMigrateLegacySharedToSharedv4Service(true) time.Sleep(180 * time.Second) // sleep 3 minutes. @@ -815,8 +829,6 @@ var _ = Describe("{LegacySharedToSharedv4ServicePxKill}", func() { log.FailOnError(err, fmt.Sprintf("Driver is down on node %s", pxNode.Name)) }) - totalSharedVolumes := getLegacySharedVolumeCount(contexts) - timeForMigration := ((totalSharedVolumes + 30) / 30) * 10 waitAllSharedVolumesToGetMigrated(contexts, timeForMigration) countPostTimeout := getLegacySharedVolumeCount(contexts) dash.VerifyFatal(countPostTimeout == 0, true, fmt.Sprintf("Post migration count is [%d] instead of 0", countPostTimeout)) diff --git a/tests/basic/misc_test.go b/tests/basic/misc_test.go index 00be264ca..fb665f6f3 100644 --- a/tests/basic/misc_test.go +++ b/tests/basic/misc_test.go @@ -10,6 +10,7 @@ import ( "github.com/portworx/torpedo/drivers/volume" "github.com/portworx/torpedo/drivers/volume/portworx" + "github.com/portworx/torpedo/drivers/volume/portworx/schedops" opsapi "github.com/libopenstorage/openstorage/api" "github.com/portworx/torpedo/pkg/log" @@ -18,6 +19,7 @@ import ( . "github.com/onsi/ginkgo/v2" "github.com/portworx/sched-ops/k8s/apps" + "github.com/portworx/sched-ops/k8s/core" "github.com/portworx/torpedo/drivers/node" "github.com/portworx/torpedo/drivers/scheduler" "github.com/portworx/torpedo/pkg/testrailuttils" @@ -25,6 +27,8 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) +var k8sCore = core.Instance() + // This test performs basic test of starting an application and destroying it (along with storage) var _ = Describe("{SetupTeardown}", func() { var testrailID = 35258 @@ -1157,3 +1161,97 @@ var _ = Describe("{AutoFSTrimReplAddWithNoPool0}", func() { AfterEachTest(contexts, testrailID, runID) }) }) + +// Add a test to detach all the disks from a node and then reattach them to a different node +var _ = Describe("{NodeDiskDetachAttach}", func() { + + JustBeforeEach(func() { + StartTorpedoTest("NodeDiskDetachAttach", "Validate disk detach and attach", nil, 0) + }) + var contexts []*scheduler.Context + + testName := "nodediskdetachattach" + stepLog := "has to detach all disks from a node and reattach them to a different node" + It(stepLog, func() { + log.InfoD(stepLog) + contexts = make([]*scheduler.Context, 0) + + for i := 0; i < Inst().GlobalScaleFactor; i++ { + contexts = append(contexts, ScheduleApplications(fmt.Sprintf("%s-%d", testName, i))...) + } + + randomNum := rand.New(rand.NewSource(time.Now().Unix())) + + ValidateApplications(contexts) + // Fetch the node where PX is not started + nonPXNodes := node.GetPXDisabledNodes() + // Remove disks from all nodes in nonPXNodes + for _, n := range nonPXNodes { + // Fetch the disks attached to the node + err := Inst().N.RemoveNonRootDisks(n) + log.FailOnError(err, fmt.Sprintf("Failed to remove disks on node %s", n.Name)) + } + randNonPxNode := nonPXNodes[randomNum.Intn(len(nonPXNodes))] + + // Fetch a random node from the StorageNodes + storageNodes := node.GetStorageNodes() + randomStorageNode := storageNodes[randomNum.Intn(len(storageNodes))] + + // Fetch random storage node and detach the disks attached to that node + var oldNodeIDtoMatch string + var newNodeIDtoMatch string + Step(fmt.Sprintf("detach disks attached from a random storage node %s and attach to non px node %s", randomStorageNode.Name, randNonPxNode.Name), func() { + log.Infof("Detaching disks from node %s and attaching to node %s", randomStorageNode.Name, randNonPxNode.Name) + // ToDo - Ensure the above selected node has volumes/apps running on it + // Store the Node ID of randomStorageNode for future use + oldNodeIDtoMatch = randomStorageNode.Id + // Stop PX on the node + err = k8sCore.AddLabelOnNode(randomStorageNode.Name, schedops.PXServiceLabelKey, "stop") + log.FailOnError(err, fmt.Sprintf("Failed to add label %s=stop on node %s", schedops.PXServiceLabelKey, randomStorageNode.Name)) + + err = Inst().N.MoveDisks(randomStorageNode, randNonPxNode) + log.FailOnError(err, fmt.Sprintf("Failed to move disks from node %s to node %s", randomStorageNode.Name, randNonPxNode.Name)) + + // Add PXEnabled false label to srcVM + err = k8sCore.AddLabelOnNode(randomStorageNode.Name, schedops.PXEnabledLabelKey, "false") + log.FailOnError(err, fmt.Sprintf("Failed to add label %s=stop on node %s", schedops.PXServiceLabelKey, randomStorageNode.Name)) + + // Start PX on the node + err = k8sCore.AddLabelOnNode(randNonPxNode.Name, schedops.PXEnabledLabelKey, "true") + log.FailOnError(err, fmt.Sprintf("Failed to add label %s=true on node %s", schedops.PXEnabledLabelKey, randNonPxNode.Name)) + err = k8sCore.AddLabelOnNode(randNonPxNode.Name, schedops.PXServiceLabelKey, "start") + log.FailOnError(err, fmt.Sprintf("Failed to add label %s=start on node %s", schedops.PXServiceLabelKey, randNonPxNode.Name)) + err = Inst().V.WaitForPxPodsToBeUp(randNonPxNode) + log.FailOnError(err, fmt.Sprintf("Failed to wait for PX pods to be up on node %s", randNonPxNode.Name)) + // Refresh the driver endpoints + err = Inst().S.RefreshNodeRegistry() + log.FailOnError(err, "error refreshing node registry") + err = Inst().V.RefreshDriverEndpoints() + log.FailOnError(err, "error refreshing storage drive endpoints") + // Wait for the driver to be up on the node + randNonPxNode, err = node.GetNodeByName(randNonPxNode.Name) + log.FailOnError(err, fmt.Sprintf("Failed to get node %s", randNonPxNode.Name)) + err = Inst().V.WaitDriverUpOnNode(randNonPxNode, Inst().DriverStartTimeout) + dash.VerifyFatal(err, nil, "Validate volume is driver up") + // Verify the node ID is same as earlier stored Node ID + newNodeIDtoMatch = randNonPxNode.Id + + dash.VerifyFatal(oldNodeIDtoMatch, newNodeIDtoMatch, fmt.Sprintf("Node ID mismatch for node %s after moving the disks", randNonPxNode.Name)) + log.Infof("Node ID matches for node %s [%s == %s]", randNonPxNode.Name, oldNodeIDtoMatch, newNodeIDtoMatch) + }) + + // ToDo - Verify the integrity of apps, cluster and volumes + + Step("destroy apps", func() { + opts := make(map[string]bool) + opts[scheduler.OptionsWaitForResourceLeakCleanup] = true + for _, ctx := range contexts { + TearDownContext(ctx, opts) + } + }) + }) + JustAfterEach(func() { + defer EndTorpedoTest() + AfterEachTest(contexts) + }) +}) diff --git a/tests/basic/node_decommission_test.go b/tests/basic/node_decommission_test.go index 50c80033f..efcca6e80 100644 --- a/tests/basic/node_decommission_test.go +++ b/tests/basic/node_decommission_test.go @@ -59,7 +59,6 @@ var _ = Describe("{DecommissionNode}", func() { for i := 0; i < Inst().GlobalScaleFactor; i++ { contexts = append(contexts, ScheduleApplications(fmt.Sprintf("%s-%d", testName, i))...) } - ValidateApplications(contexts) var storageDriverNodes []node.Node diff --git a/tests/basic/ocp_node_recycle_test.go b/tests/basic/ocp_node_recycle_test.go deleted file mode 100644 index 6211591e6..000000000 --- a/tests/basic/ocp_node_recycle_test.go +++ /dev/null @@ -1,277 +0,0 @@ -package tests - -import ( - "fmt" - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" - "github.com/portworx/sched-ops/k8s/operator" - "github.com/portworx/torpedo/drivers/node" - "github.com/portworx/torpedo/drivers/scheduler" - "github.com/portworx/torpedo/drivers/scheduler/openshift" - "github.com/portworx/torpedo/pkg/log" - . "github.com/portworx/torpedo/tests" -) - -// Sanity test for OCP Recycle method -var _ = Describe("{RecycleOCPNode}", func() { - - var contexts []*scheduler.Context - - BeforeEach(func() { - wantAllAfterSuiteActions = false - wantAfterSuiteSystemCheck = true - }) - JustBeforeEach(func() { - StartTorpedoTest("RecycleOCPNode", "Test drives and pools after recyling a node", nil, 0) - }) - - It("Validing the drives and pools after recyling a node", func() { - Step("Get the storage and storageless nodes and delete them", func() { - if Inst().S.String() != openshift.SchedName { - log.Warnf("Failed: This test is not supported for scheduler: [%s]", Inst().S.String()) - return - } - contexts = make([]*scheduler.Context, 0) - - for i := 0; i < Inst().GlobalScaleFactor; i++ { - contexts = append(contexts, ScheduleApplications(fmt.Sprintf("recyclenode-%d", i))...) - } - - ValidateApplications(contexts) - storagelessNodes, err := Inst().V.GetStoragelessNodes() - Expect(err).NotTo(HaveOccurred(), fmt.Sprintf("Failed to get storageless nodes. Error: [%v]", err)) - if storagelessNodes != nil { - delNode, err := node.GetNodeByName(storagelessNodes[0].Hostname) - Expect(err).NotTo(HaveOccurred(), fmt.Sprintf("Failed to get node object using Name. Error: [%v]", err)) - Step( - fmt.Sprintf("Listing all nodes before recycling a storageless node %s", delNode.Name), - func() { - workerNodes := node.GetWorkerNodes() - for x, wNode := range workerNodes { - log.Infof("WorkerNode[%d] is: [%s] and volDriverID is [%s]", x, wNode.Name, wNode.VolDriverNodeID) - } - }) - Step( - fmt.Sprintf("Recycle a storageless node and validating the drives: %s", delNode.Name), - func() { - err := Inst().S.DeleteNode(delNode) - Expect(err).NotTo(HaveOccurred(), - fmt.Sprintf("Failed to recycle a node [%s]. Error: [%v]", delNode.Name, err)) - - }) - Step( - fmt.Sprintf("Listing all nodes after recycle a storageless node %s", delNode.Name), - func() { - workerNodes := node.GetWorkerNodes() - for x, wNode := range workerNodes { - log.Infof("WorkerNode[%d] is: [%s] and volDriverID is [%s]", x, wNode.Name, wNode.VolDriverNodeID) - } - }) - } - // Validating the apps after recycling the StorageLess node - ValidateApplications(contexts) - workerNodes := node.GetStorageDriverNodes() - delNode := workerNodes[0] - Step( - fmt.Sprintf("Recycle a storage node: [%s] and validating the drives", delNode.Name), - func() { - err := Inst().S.DeleteNode(delNode) - Expect(err).NotTo(HaveOccurred(), - fmt.Sprintf("Failed to recycle a node [%s]. Error: [%v]", delNode.Name, err)) - }) - Step(fmt.Sprintf("Listing all nodes after recycling a storage node %s", delNode.Name), func() { - workerNodes := node.GetWorkerNodes() - for x, wNode := range workerNodes { - log.Infof("WorkerNode[%d] is: [%s] and volDriverID is [%s]", x, wNode.Name, wNode.VolDriverNodeID) - } - }) - // Validating the apps after recycling the Storage node - ValidateApplications(contexts) - }) - }) - JustAfterEach(func() { - EndTorpedoTest() - }) -}) - -var _ = Describe("{AddOCPStorageNode}", func() { - - var contexts []*scheduler.Context - - BeforeEach(func() { - wantAllAfterSuiteActions = false - wantAfterSuiteSystemCheck = true - }) - JustBeforeEach(func() { - StartTorpedoTest("AddOCPStorageNode", "Add a new storage node the OCP cluster", nil, 0) - }) - stepLog := "Validating the drives and pools after adding new storage node" - - It(stepLog, func() { - log.InfoD(stepLog) - stepLog = "Add storage node" - - Step(stepLog, func() { - if Inst().S.String() != openshift.SchedName { - log.Warnf("Failed: This test is not supported for scheduler: [%s]", Inst().S.String()) - return - } - log.InfoD(stepLog) - contexts = make([]*scheduler.Context, 0) - - for i := 0; i < Inst().GlobalScaleFactor; i++ { - contexts = append(contexts, ScheduleApplications(fmt.Sprintf("addstnode-%d", i))...) - } - - ValidateApplications(contexts) - - var numOfStorageNodes int - Step(stepLog, func() { - log.InfoD(stepLog) - stc, err := Inst().V.GetDriver() - - log.FailOnError(err, "error getting volume driver") - maxStorageNodesPerZone := *stc.Spec.CloudStorage.MaxStorageNodesPerZone - numOfStorageNodes = len(node.GetStorageNodes()) - log.Infof("maxStorageNodesPerZone %d", int(maxStorageNodesPerZone)) - log.Infof("numOfStorageNodes %d", numOfStorageNodes) - - var updatedMaxStorageNodesPerZone uint32 = 0 - if int(maxStorageNodesPerZone) == numOfStorageNodes { - //increase max per zone - updatedMaxStorageNodesPerZone = maxStorageNodesPerZone + 1 - } - - if int(maxStorageNodesPerZone) < numOfStorageNodes { - //updating max per zone - updatedMaxStorageNodesPerZone = uint32(numOfStorageNodes) - } - if updatedMaxStorageNodesPerZone != 0 { - - stc.Spec.CloudStorage.MaxStorageNodesPerZone = &updatedMaxStorageNodesPerZone - log.InfoD("updating maxStorageNodesPerZone from %d to %d", maxStorageNodesPerZone, updatedMaxStorageNodesPerZone) - pxOperator := operator.Instance() - _, err = pxOperator.UpdateStorageCluster(stc) - log.FailOnError(err, "error updating storage cluster") - - } - //Scaling the cluster by one node - expReplicas := len(node.GetWorkerNodes()) + 1 - log.InfoD("scaling up the cluster to replicas %d", expReplicas) - err = Inst().S.ScaleCluster(expReplicas) - - dash.VerifyFatal(err, nil, fmt.Sprintf("verify cluster successfully scaled to %d", expReplicas)) - - }) - - stepLog = "validate PX on all nodes after cluster scale up" - - Step(stepLog, func() { - log.InfoD(stepLog) - nodes := node.GetWorkerNodes() - for _, n := range nodes { - log.InfoD("Check PX status on %v", n.Name) - err := Inst().V.WaitForPxPodsToBeUp(n) - dash.VerifyFatal(err, nil, fmt.Sprintf("verify px is up on node %s", n.Name)) - } - }) - - err := Inst().V.RefreshDriverEndpoints() - log.FailOnError(err, "error refreshing driver end points") - - updatedStorageNodesCount := len(node.GetStorageNodes()) - dash.VerifySafely(numOfStorageNodes+1, updatedStorageNodesCount, "verify new storage node is added") - ValidateAndDestroy(contexts, nil) - }) - }) - JustAfterEach(func() { - EndTorpedoTest() - }) -}) - -var _ = Describe("{AddOCPStoragelessNode}", func() { - - var contexts []*scheduler.Context - - BeforeEach(func() { - wantAllAfterSuiteActions = false - wantAfterSuiteSystemCheck = true - }) - JustBeforeEach(func() { - StartTorpedoTest("AddOCPStoragelessNode", "Add a new storageless node the OCP cluster", nil, 0) - }) - stepLog := "Validating px after adding new storageless node" - - It(stepLog, func() { - log.InfoD(stepLog) - stepLog = "Add storageless node" - - Step(stepLog, func() { - if Inst().S.String() != openshift.SchedName { - log.Warnf("Failed: This test is not supported for scheduler: [%s]", Inst().S.String()) - return - } - log.InfoD(stepLog) - contexts = make([]*scheduler.Context, 0) - - for i := 0; i < Inst().GlobalScaleFactor; i++ { - contexts = append(contexts, ScheduleApplications(fmt.Sprintf("addslnode-%d", i))...) - } - - ValidateApplications(contexts) - numOfStoragelessNodes := len(node.GetStorageLessNodes()) - - Step(stepLog, func() { - log.InfoD(stepLog) - stc, err := Inst().V.GetDriver() - - log.FailOnError(err, "error getting volume driver") - maxStorageNodesPerZone := *stc.Spec.CloudStorage.MaxStorageNodesPerZone - numOfStorageNodes := len(node.GetStorageNodes()) - log.Infof("maxStorageNodesPerZone %d", int(maxStorageNodesPerZone)) - log.Infof("numOfStoragelessNodes %d", numOfStoragelessNodes) - - if int(maxStorageNodesPerZone) > numOfStorageNodes { - //updating max per zone - updatedMaxStorageNodesPerZone := uint32(numOfStorageNodes) - stc.Spec.CloudStorage.MaxStorageNodesPerZone = &updatedMaxStorageNodesPerZone - log.InfoD("updating maxStorageNodesPerZone from %d to %d", maxStorageNodesPerZone, updatedMaxStorageNodesPerZone) - pxOperator := operator.Instance() - _, err = pxOperator.UpdateStorageCluster(stc) - log.FailOnError(err, "error updating storage cluster") - - } - //Scaling the cluster by one node - expReplicas := len(node.GetWorkerNodes()) + 1 - log.InfoD("scaling up the cluster to replicas %d", expReplicas) - err = Inst().S.ScaleCluster(expReplicas) - - dash.VerifyFatal(err, nil, fmt.Sprintf("verify cluster successfully scaled to %d", expReplicas)) - - }) - - stepLog = "validate PX on all nodes after cluster scale up" - - Step(stepLog, func() { - log.InfoD(stepLog) - nodes := node.GetWorkerNodes() - for _, n := range nodes { - log.InfoD("Check PX status on %v", n.Name) - err := Inst().V.WaitForPxPodsToBeUp(n) - dash.VerifyFatal(err, nil, fmt.Sprintf("verify px is up on node %s", n.Name)) - } - }) - - err := Inst().V.RefreshDriverEndpoints() - log.FailOnError(err, "error refreshing driver end points") - - updatedStoragelessNodesCount := len(node.GetStorageLessNodes()) - dash.VerifySafely(numOfStoragelessNodes+1, updatedStoragelessNodesCount, "verify new storageless node is added") - - ValidateAndDestroy(contexts, nil) - }) - }) - JustAfterEach(func() { - EndTorpedoTest() - }) -}) diff --git a/tests/basic/pool_function_test.go b/tests/basic/pool_function_test.go index b76278676..d588f4073 100644 --- a/tests/basic/pool_function_test.go +++ b/tests/basic/pool_function_test.go @@ -52,27 +52,35 @@ var _ = Describe("{PoolExpandMultipleTimes}", func() { EndTorpedoTest() }) - //It("Select a pool and expand it by 100 GiB 3 time with add-disk type. ", func() { - // StartTorpedoTest("PoolExpandDiskAdd3Times", - // "Validate storage pool expansion 3 times with type=add-disk", nil, 0) - // for i := 0; i < 3; i++ { - // poolToResize = getStoragePool(poolIDToResize) - // originalSizeInBytes = poolToResize.TotalSize - // targetSizeInBytes = originalSizeInBytes + 100*units.GiB - // targetSizeGiB = targetSizeInBytes / units.GiB - - // log.InfoD("Current Size of pool %s is %d GiB. Expand to %v GiB with type add-disk...", - // poolIDToResize, poolToResize.TotalSize/units.GiB, targetSizeGiB) - // triggerPoolExpansion(poolIDToResize, targetSizeGiB, api.SdkStoragePool_RESIZE_TYPE_ADD_DISK) - // resizeErr := waitForOngoingPoolExpansionToComplete(poolIDToResize) - // dash.VerifyFatal(resizeErr, nil, "Pool expansion does not result in error") - // verifyPoolSizeEqualOrLargerThanExpected(poolIDToResize, targetSizeGiB) - // } - //}) + It("Select a pool and expand it by 100 GiB 3 time with add-disk type. ", func() { + // TestRail:https://portworx.testrail.net/index.php?/tests/view/86355092 + StartTorpedoTest("PoolExpandDiskAdd3Times", + "Validate storage pool expansion 3 times with type=add-disk", nil, 86355092) + for i := 0; i < 3; i++ { + poolToResize = getStoragePool(poolIDToResize) + originalSizeInBytes = poolToResize.TotalSize + targetSizeInBytes = originalSizeInBytes + 100*units.GiB + targetSizeGiB = targetSizeInBytes / units.GiB + + log.InfoD("Current Size of pool %s is %d GiB. Expand to %v GiB with type add-disk...", + poolIDToResize, poolToResize.TotalSize/units.GiB, targetSizeGiB) + triggerPoolExpansion(poolIDToResize, targetSizeGiB, api.SdkStoragePool_RESIZE_TYPE_ADD_DISK) + resizeErr := waitForOngoingPoolExpansionToComplete(poolIDToResize) + + if isDMthin, _ := IsDMthin(); isDMthin { + dash.VerifyFatal(resizeErr != nil, true, + "Pool expansion request of add-disk type should be rejected with dmthin") + } else { + dash.VerifyFatal(resizeErr, nil, "Pool expansion does not result in error") + verifyPoolSizeEqualOrLargerThanExpected(poolIDToResize, targetSizeGiB) + } + } + }) It("Select a pool and expand it by 100 GiB 3 times with resize-disk type. ", func() { + // TestRail:https://portworx.testrail.net/index.php?/tests/view/86355067 StartTorpedoTest("PoolExpandDiskResize3Times", - "Validate storage pool expansion with type=resize-disk", nil, 0) + "Validate storage pool expansion with type=resize-disk", nil, 86355067) for i := 0; i < 3; i++ { poolToResize = getStoragePool(poolIDToResize) originalSizeInBytes = poolToResize.TotalSize @@ -89,7 +97,7 @@ var _ = Describe("{PoolExpandMultipleTimes}", func() { }) }) -var _ = Describe("{PoolExpandSmoky}", func() { +var _ = Describe("{PoolExpandSmoke}", func() { BeforeEach(func() { contexts = scheduleApps() }) @@ -109,21 +117,6 @@ var _ = Describe("{PoolExpandSmoky}", func() { EndTorpedoTest() }) - //It("Select a pool and expand it by 100 GiB with add-disk type. ", func() { - // StartTorpedoTest("PoolExpandDiskAdd", - // "Validate storage pool expansion with type=add-disk", nil, 0) - // originalSizeInBytes = poolToResize.TotalSize - // targetSizeInBytes = originalSizeInBytes + 100*units.GiB - // targetSizeGiB = targetSizeInBytes / units.GiB - - // log.InfoD("Current Size of the pool %s is %d GiB. Trying to expand to %v GiB with type add-disk", - // poolIDToResize, poolToResize.TotalSize/units.GiB, targetSizeGiB) - // triggerPoolExpansion(poolIDToResize, targetSizeGiB, api.SdkStoragePool_RESIZE_TYPE_ADD_DISK) - // resizeErr := waitForOngoingPoolExpansionToComplete(poolIDToResize) - // dash.VerifyFatal(resizeErr, nil, "Pool expansion does not result in error") - // verifyPoolSizeEqualOrLargerThanExpected(poolIDToResize, targetSizeGiB) - //}) - It("Verify expanding pool with add-disk type is rejected with dmthin. ", func() { StartTorpedoTest("PoolExpandDiskAdd", "Validate storage pool expansion with type=add-disk", nil, 0) @@ -134,12 +127,8 @@ var _ = Describe("{PoolExpandSmoky}", func() { log.InfoD("Current Size of the pool %s is %d GiB. Trying to expand to %v GiB with type add-disk", poolIDToResize, poolToResize.TotalSize/units.GiB, targetSizeGiB) triggerPoolExpansion(poolIDToResize, targetSizeGiB, api.SdkStoragePool_RESIZE_TYPE_ADD_DISK) - resizeErr := waitForOngoingPoolExpansionToComplete(poolIDToResize) - - if isDMthin, _ := IsDMthin(); isDMthin { - dash.VerifyFatal(resizeErr != nil, true, - "Pool expansion request of add-disk type should be rejected with dmthin") - } else { + if isDMthin, _ := IsDMthin(); !isDMthin { + resizeErr := waitForOngoingPoolExpansionToComplete(poolIDToResize) dash.VerifyFatal(resizeErr, nil, "Pool expansion does not result in error") verifyPoolSizeEqualOrLargerThanExpected(poolIDToResize, targetSizeGiB) } @@ -174,10 +163,94 @@ var _ = Describe("{PoolExpandSmoky}", func() { dash.VerifyFatal(resizeErr, nil, "Pool expansion does not result in error") verifyPoolSizeEqualOrLargerThanExpected(poolIDToResize, targetSizeGiB) }) +}) +var _ = Describe("{PoolExpandRejectConcurrentDiskResize}", func() { + BeforeEach(func() { + contexts = scheduleApps() + }) + + JustBeforeEach(func() { + poolIDToResize = pickPoolToResize() + log.Infof("Picked pool %s to resize", poolIDToResize) + poolToResize = getStoragePool(poolIDToResize) + storageNode, err = GetNodeWithGivenPoolID(poolIDToResize) + log.FailOnError(err, "Failed to get node with given pool ID") + }) + + JustAfterEach(func() { + AfterEachTest(contexts) + }) + + AfterEach(func() { + appsValidateAndDestroy(contexts) + EndTorpedoTest() + }) + + // test resizing all pools on one storage node concurrently and ensure only the first one makes progress + It("Select all pools on a storage node and expand them concurrently. ", func() { + // TestRail:https://portworx.testrail.net/index.php?/tests/view/86355074 + StartTorpedoTest("PoolExpandRejectConcurrentDiskResize", + "Validate storage pool expansion rejects concurrent requests", nil, 86355074) + var pools []*api.StoragePool + Step("Verify multiple pools are present on this node", func() { + // collect all pools available + pools = append(pools, storageNode.Pools...) + dash.VerifyFatal(len(pools) > 1, true, "This test requires more than 1 pool.") + }) + + Step("Expand all pools concurrently. ", func() { + expandType := api.SdkStoragePool_RESIZE_TYPE_RESIZE_DISK + var wg sync.WaitGroup + for _, p := range pools { + wg.Add(1) + go func(p *api.StoragePool) { + defer wg.Done() + err = Inst().V.ExpandPool(p.Uuid, expandType, p.TotalSize/units.GiB+100, true) + }(p) + } + wg.Wait() + }) + + Step("Verify only one expansion is making progress at any given time", func() { + inProgressCount := 0 + startTime := time.Now() + for time.Since(startTime) < 1*time.Minute { + inProgressCount = 0 + time.Sleep(1 * time.Second) + storageNode, err = GetNodeWithGivenPoolID(poolIDToResize) + for _, p := range storageNode.Pools { + if p.LastOperation.Status == api.SdkStoragePool_OPERATION_IN_PROGRESS { + inProgressCount++ + } + dash.VerifyFatal(inProgressCount <= 1, true, "Only one pool expansion should be in progress at any given time.") + } + } + }) + }) + + // test expansion request on a pool while a previous expansion is in progress is rejected + It("Expand a pool while a previous expansion is in progress", func() { + expandType := api.SdkStoragePool_RESIZE_TYPE_RESIZE_DISK + targetSize := poolToResize.TotalSize/units.GiB + 100 + err = Inst().V.ExpandPool(poolIDToResize, expandType, targetSize, true) + isExpandInProgress, expandErr := poolResizeIsInProgress(poolToResize) + if expandErr != nil { + log.Fatalf("Error checking if pool expansion is in progress: %v", expandErr) + } + if !isExpandInProgress { + log.Warnf("Pool expansion already finished. Skipping this test. Use a testing app that writes " + + "more data which may slow down resize-disk type expansion. ") + return + } + expandResponse := Inst().V.ExpandPoolUsingPxctlCmd(*storageNode, poolToResize.Uuid, expandType, targetSize+100, true) + dash.VerifyFatal(expandResponse != nil, true, "Pool expansion should fail when expansion is in progress") + dash.VerifyFatal(strings.Contains(expandResponse.Error(), "is already in progress"), true, + "Pool expansion failure reason should be communicated to the user ") + }) }) -var _ = Describe("{PoolExpandRejectConcurrent}", func() { +var _ = Describe("{PoolExpandRejectConcurrentDiskAdd}", func() { BeforeEach(func() { contexts = scheduleApps() }) @@ -186,8 +259,6 @@ var _ = Describe("{PoolExpandRejectConcurrent}", func() { poolIDToResize = pickPoolToResize() log.Infof("Picked pool %s to resize", poolIDToResize) poolToResize = getStoragePool(poolIDToResize) - resizeErr := waitForOngoingPoolExpansionToComplete(poolIDToResize) - dash.VerifyFatal(resizeErr, nil, "Previous pool expansion(s) should not result in error") storageNode, err = GetNodeWithGivenPoolID(poolIDToResize) log.FailOnError(err, "Failed to get node with given pool ID") }) @@ -203,15 +274,13 @@ var _ = Describe("{PoolExpandRejectConcurrent}", func() { // test resizing all pools on one storage node concurrently and ensure only the first one makes progress It("Select all pools on a storage node and expand them concurrently. ", func() { - // TestRail:https://portworx.testrail.net/index.php?/tests/view/34542836&group_by=cases:custom_automated&group_order=desc&group_id=2 + // TestRail:https://portworx.testrail.net/index.php?/tests/view/34542836 StartTorpedoTest("PoolExpandRejectConcurrent", "Validate storage pool expansion rejects concurrent requests", nil, 34542836) var pools []*api.StoragePool Step("Verify multiple pools are present on this node", func() { // collect all pools available - for _, p := range storageNode.Pools { - pools = append(pools, p) - } + pools = append(pools, storageNode.Pools...) dash.VerifyFatal(len(pools) > 1, true, "This test requires more than 1 pool.") }) @@ -233,7 +302,7 @@ var _ = Describe("{PoolExpandRejectConcurrent}", func() { startTime := time.Now() for time.Since(startTime) < 1*time.Minute { inProgressCount = 0 - time.Sleep(5) + time.Sleep(5 * time.Second) storageNode, err = GetNodeWithGivenPoolID(poolIDToResize) for _, p := range storageNode.Pools { if p.LastOperation.Status == api.SdkStoragePool_OPERATION_IN_PROGRESS { @@ -253,7 +322,7 @@ var _ = Describe("{PoolExpandRejectConcurrent}", func() { // wait for expansion to start // TODO: this is a hack to wait for expansion to start. The existing WaitForExpansionToStart() risks returning // when the expansion has already completed. - time.Sleep(1) + time.Sleep(5 * time.Second) // verify pool expansion is in progress isExpandInProgress, expandErr := poolResizeIsInProgress(poolToResize) if expandErr != nil { @@ -271,7 +340,62 @@ var _ = Describe("{PoolExpandRejectConcurrent}", func() { }) }) -var _ = Describe("{PoolExpandWithReboot}", func() { +var _ = Describe("{PoolExpandDiskResizeWithReboot}", func() { + BeforeEach(func() { + contexts = scheduleApps() + }) + + JustBeforeEach(func() { + poolIDToResize = pickPoolToResize() + log.Infof("Picked pool %s to resize", poolIDToResize) + poolToResize = getStoragePool(poolIDToResize) + storageNode, err = GetNodeWithGivenPoolID(poolIDToResize) + log.FailOnError(err, "Failed to get node with given pool ID") + }) + + JustAfterEach(func() { + AfterEachTest(contexts) + }) + + AfterEach(func() { + appsValidateAndDestroy(contexts) + EndTorpedoTest() + }) + + It("Initiate pool expansion using resize-disk and reboot node", func() { + StartTorpedoTest("PoolExpandDiskResizeWithReboot", "Initiate pool expansion using resize-disk and reboot node", nil, 51309) + runID = testrailuttils.AddRunsToMilestone(testrailID) + Step("Select a pool that has I/O and expand it by 100 GiB with resize-disk type. ", func() { + originalSizeInBytes = poolToResize.TotalSize + targetSizeInBytes = originalSizeInBytes + 100*units.GiB + targetSizeGiB = targetSizeInBytes / units.GiB + log.InfoD("Current Size of the pool %s is %d GiB. Trying to expand to %v GiB with type resize-disk", + poolIDToResize, poolToResize.TotalSize/units.GiB, targetSizeGiB) + triggerPoolExpansion(poolIDToResize, targetSizeGiB, api.SdkStoragePool_RESIZE_TYPE_RESIZE_DISK) + }) + + Step("Wait for expansion to start and reboot node", func() { + err := WaitForExpansionToStart(poolIDToResize) + log.FailOnError(err, "Timed out waiting for expansion to start") + err = RebootNodeAndWaitForPxUp(*storageNode) + log.FailOnError(err, "Failed to reboot node and wait till it is up") + }) + + log.Infof("Debug Pool %s", poolIDToResize) + Step("Ensure pool has been expanded to the expected size", func() { + _ = waitForOngoingPoolExpansionToComplete(poolIDToResize) + verifyPoolSizeEqualOrLargerThanExpected(poolIDToResize, targetSizeGiB) + }) + log.Infof("Debug Pool %s", poolIDToResize) + Step("Pool has expanded. Reboot the node", func() { + err = RebootNodeAndWaitForPxUp(*storageNode) + log.FailOnError(err, "Failed to reboot node and wait till it is up") + verifyPoolSizeEqualOrLargerThanExpected(poolIDToResize, targetSizeGiB) + }) + }) +}) + +var _ = Describe("{PoolExpandDiskAddWithReboot}", func() { BeforeEach(func() { contexts = scheduleApps() }) @@ -317,10 +441,16 @@ var _ = Describe("{PoolExpandWithReboot}", func() { dash.VerifyFatal(err, nil, "Pool expansion does not result in error") verifyPoolSizeEqualOrLargerThanExpected(poolIDToResize, targetSizeGiB) }) + + Step("Pool has expanded. Reboot the node", func() { + err = RebootNodeAndWaitForPxUp(*storageNode) + log.FailOnError(err, "Failed to reboot node and wait till it is up") + verifyPoolSizeEqualOrLargerThanExpected(poolIDToResize, targetSizeGiB) + }) }) }) -var _ = Describe("{PoolExpandWithPXRestart}", func() { +var _ = Describe("{PoolExpandDiskResizePXRestart}", func() { BeforeEach(func() { contexts = scheduleApps() }) @@ -346,13 +476,13 @@ var _ = Describe("{PoolExpandWithPXRestart}", func() { StartTorpedoTest("RestartAfterPoolExpansion", "Restart PX after pool expansion", nil, testrailID) - Step("Select a pool that has I/O and expand it by 100 GiB with add-disk type. ", func() { + Step("Select a pool that has I/O and expand it by 100 GiB with resize-disk type. ", func() { originalSizeInBytes = poolToResize.TotalSize targetSizeInBytes = originalSizeInBytes + 100*units.GiB targetSizeGiB = targetSizeInBytes / units.GiB - log.InfoD("Current Size of the pool %s is %d GiB. Trying to expand to %v GiB with type add-disk", + log.InfoD("Current Size of the pool %s is %d GiB. Trying to expand to %v GiB with type resize-disk", poolIDToResize, poolToResize.TotalSize/units.GiB, targetSizeGiB) - triggerPoolExpansion(poolIDToResize, targetSizeGiB, api.SdkStoragePool_RESIZE_TYPE_ADD_DISK) + triggerPoolExpansion(poolIDToResize, targetSizeGiB, api.SdkStoragePool_RESIZE_TYPE_RESIZE_DISK) }) Step("Wait for expansion to finish and restart PX", func() { @@ -371,11 +501,42 @@ var _ = Describe("{PoolExpandWithPXRestart}", func() { dash.VerifyFatal(poolToResize != nil, true, "Pool is up and running after restart") verifyPoolSizeEqualOrLargerThanExpected(poolIDToResize, targetSizeGiB) }) + + Step("Expansioin successful. Restart PX", func() { + err = Inst().V.RestartDriver(*storageNode, nil) + log.FailOnError(err, fmt.Sprintf("Error restarting px on node [%s]", storageNode.Name)) + err = Inst().V.WaitDriverUpOnNode(*storageNode, addDriveUpTimeOut) + log.FailOnError(err, fmt.Sprintf("Timed out waiting for px to come up on node [%s]", storageNode.Name)) + verifyPoolSizeEqualOrLargerThanExpected(poolIDToResize, targetSizeGiB) + }) }) +}) - It("Initiate pool expansion using add-drive and restart PX", func() { - StartTorpedoTest("PoolExpandAddDiskAndPXRestart", - "Initiate pool expansion using add-drive and restart PX", nil, testrailID) +var _ = Describe("{PoolExpandDiskAddPXRestart}", func() { + BeforeEach(func() { + contexts = scheduleApps() + }) + + JustBeforeEach(func() { + poolIDToResize = pickPoolToResize() + log.Infof("Picked pool %s to resize", poolIDToResize) + poolToResize = getStoragePool(poolIDToResize) + storageNode, err = GetNodeWithGivenPoolID(poolIDToResize) + log.FailOnError(err, "Failed to get node with given pool ID") + }) + + JustAfterEach(func() { + AfterEachTest(contexts) + }) + + AfterEach(func() { + appsValidateAndDestroy(contexts) + EndTorpedoTest() + }) + + It("Restart PX after pool expansion", func() { + StartTorpedoTest("RestartAfterPoolExpansion", + "Restart PX after pool expansion", nil, testrailID) Step("Select a pool that has I/O and expand it by 100 GiB with add-disk type. ", func() { originalSizeInBytes = poolToResize.TotalSize @@ -386,31 +547,65 @@ var _ = Describe("{PoolExpandWithPXRestart}", func() { triggerPoolExpansion(poolIDToResize, targetSizeGiB, api.SdkStoragePool_RESIZE_TYPE_ADD_DISK) }) - Step("Wait for expansion to start and reboot node", func() { - err := WaitForExpansionToStart(poolIDToResize) - log.FailOnError(err, "Timed out waiting for expansion to start") + Step("Wait for expansion to finish and restart PX", func() { + resizeErr := waitForOngoingPoolExpansionToComplete(poolIDToResize) + dash.VerifyFatal(resizeErr, nil, "Pool expansion does not result in error") + log.FailOnError(Inst().V.RestartDriver(*storageNode, nil), + fmt.Sprintf("Error restarting px on node [%s]", storageNode.Name)) + log.FailOnError(Inst().V.WaitDriverUpOnNode(*storageNode, addDriveUpTimeOut), + fmt.Sprintf("Timed out waiting for px to come up on node [%s]", storageNode.Name)) + }) + + Step("Ensure pool is up and running", func() { + // Ensure pool is up and running + poolToResize = getStoragePool(poolIDToResize) + // Ensure poolToResize is not nil + dash.VerifyFatal(poolToResize != nil, true, "Pool is up and running after restart") + verifyPoolSizeEqualOrLargerThanExpected(poolIDToResize, targetSizeGiB) + }) + + Step("Expansioin successful. Restart PX", func() { err = Inst().V.RestartDriver(*storageNode, nil) log.FailOnError(err, fmt.Sprintf("Error restarting px on node [%s]", storageNode.Name)) err = Inst().V.WaitDriverUpOnNode(*storageNode, addDriveUpTimeOut) log.FailOnError(err, fmt.Sprintf("Timed out waiting for px to come up on node [%s]", storageNode.Name)) - }) - - Step("Ensure pool has been expanded to the expected size", func() { - resizeErr := waitForOngoingPoolExpansionToComplete(poolIDToResize) - dash.VerifyFatal(resizeErr, nil, "Pool expansion does not result in error") verifyPoolSizeEqualOrLargerThanExpected(poolIDToResize, targetSizeGiB) }) }) }) -var _ = Describe("{PoolExpandResizeInvalidPoolID}", func() { +var _ = Describe("{PoolExpandInvalidSize}", func() { + // TestrailId: https://portworx.testrail.net/index.php?/tests/view/34542945 + BeforeEach(func() { + StartTorpedoTest("PoolExpansionDiskResizeInvalidSize", + "Initiate pool expansion using invalid expansion size", nil, 34542945) + }) + + AfterEach(func() { + EndTorpedoTest() + }) + + stepLog := "select a pool and expand it by 30000000 GiB with resize-disk type" + It(stepLog, func() { + log.InfoD(stepLog) + // pick pool to resize + pools, err := GetAllPoolsPresent() + log.FailOnError(err, "Unable to get the storage Pools") + pooltoPick := pools[0] + storageNode, err = GetNodeWithGivenPoolID(pooltoPick) + log.FailOnError(err, "Failed to get node with given pool ID") + + resizeErr := Inst().V.ExpandPool(pooltoPick, api.SdkStoragePool_RESIZE_TYPE_RESIZE_DISK, 30000000, true) + dash.VerifyFatal(resizeErr, nil, "Verify error occurs with invalid Pool expansion size") + }) - var testrailID = 34542946 - // testrailID corresponds to: https://portworx.testrail.net/index.php?/tests/view/34542946 +}) +var _ = Describe("{PoolExpandResizeInvalidPoolID}", func() { + // TestrailID: https://portworx.testrail.net/index.php?/tests/view/34542946 BeforeEach(func() { StartTorpedoTest("PoolExpandResizeInvalidPoolID", - "Initiate pool expansion using invalid Id", nil, testrailID) + "Initiate pool expansion using invalid Id", nil, 34542946) }) AfterEach(func() { @@ -426,7 +621,7 @@ var _ = Describe("{PoolExpandResizeInvalidPoolID}", func() { // Resize Pool with Invalid Pool ID stepLog = fmt.Sprintf("Expanding pool on Node UUID [%s] using auto", invalidPoolUUID) Step(stepLog, func() { - resizeErr := Inst().V.ExpandPool(invalidPoolUUID, api.SdkStoragePool_RESIZE_TYPE_AUTO, 100, true) + resizeErr := Inst().V.ExpandPool(invalidPoolUUID, api.SdkStoragePool_RESIZE_TYPE_RESIZE_DISK, 100, true) dash.VerifyFatal(resizeErr != nil, true, "Verify error occurs with invalid Pool UUID") // Verify error on pool expansion failure var errMatch error @@ -441,14 +636,11 @@ var _ = Describe("{PoolExpandResizeInvalidPoolID}", func() { }) -var _ = Describe("{PoolExpandDiskAddAndVerifyFromOtherNode}", func() { - - var testrailID = 34542840 - // testrailID corresponds to: https://portworx.testrail.net/index.php?/tests/view/34542840 +var _ = Describe("{PoolExpandDiskResizeAndVerifyFromOtherNode}", func() { BeforeEach(func() { - StartTorpedoTest("PoolExpandDiskAddAndVerifyFromOtherNode", - "Initiate pool expansion and verify from other node", nil, testrailID) + StartTorpedoTest("PoolExpandDiskResizeAndVerifyFromOtherNode", + "Initiate pool expansion and verify from other node", nil, 34542840) contexts = scheduleApps() }) @@ -469,7 +661,7 @@ var _ = Describe("{PoolExpandDiskAddAndVerifyFromOtherNode}", func() { EndTorpedoTest() }) - stepLog := "should get the existing pool and expand it by adding a disk and verify from other node" + stepLog := "should get the existing pool and expand it by resizing a disk and verify from other node" It(stepLog, func() { log.InfoD(stepLog) // get original total size @@ -485,9 +677,9 @@ var _ = Describe("{PoolExpandDiskAddAndVerifyFromOtherNode}", func() { targetSizeInBytes = originalSizeInBytes + 100*units.GiB targetSizeGiB = targetSizeInBytes / units.GiB - log.InfoD("Current Size of the pool %s is %d GiB. Trying to expand to %v GiB with type add-disk", + log.InfoD("Current Size of the pool %s is %d GiB. Trying to expand to %v GiB with type resize-disk", poolIDToResize, poolToResize.TotalSize/units.GiB, targetSizeGiB) - triggerPoolExpansion(poolIDToResize, targetSizeGiB, api.SdkStoragePool_RESIZE_TYPE_ADD_DISK) + triggerPoolExpansion(poolIDToResize, targetSizeGiB, api.SdkStoragePool_RESIZE_TYPE_RESIZE_DISK) Step("Ensure pool has been expanded to the expected size", func() { err = waitForOngoingPoolExpansionToComplete(poolIDToResize) @@ -520,50 +712,88 @@ var _ = Describe("{PoolExpandDiskAddAndVerifyFromOtherNode}", func() { }) -var _ = Describe("{PoolExpansionDiskResizeInvalidSize}", func() { +var _ = Describe("{PoolExpandDiskAddAndVerifyFromOtherNode}", func() { + // TestrailID: https://portworx.testrail.net/index.php?/tests/view/34542840 + BeforeEach(func() { + StartTorpedoTest("PoolExpandDiskAddAndVerifyFromOtherNode", + "Initiate pool expansion and verify from other node", nil, 34542840) + contexts = scheduleApps() + }) - var testrailID = 34542945 - // testrailID corresponds to: https://portworx.testrail.net/index.php?/tests/view/34542945 + JustBeforeEach(func() { + poolIDToResize = pickPoolToResize() + log.Infof("Picked pool %s to resize", poolIDToResize) + poolToResize = getStoragePool(poolIDToResize) + storageNode, err = GetNodeWithGivenPoolID(poolIDToResize) + log.FailOnError(err, "Failed to get node with given pool ID") + }) - BeforeEach(func() { - StartTorpedoTest("PoolExpansionDiskResizeInvalidSize", - "Initiate pool expansion using invalid expansion size", nil, testrailID) + JustAfterEach(func() { + AfterEachTest(contexts) }) AfterEach(func() { + appsValidateAndDestroy(contexts) EndTorpedoTest() }) - stepLog := "select a pool and expand it by 30000000 GiB with resize-disk type" + stepLog := "should get the existing pool and expand it by adding a disk and verify from other node" It(stepLog, func() { log.InfoD(stepLog) - // pick pool to resize - pools, err := GetAllPoolsPresent() - log.FailOnError(err, "Unable to get the storage Pools") - pooltoPick := pools[0] - storageNode, err = GetNodeWithGivenPoolID(pooltoPick) - log.FailOnError(err, "Failed to get node with given pool ID") + // get original total size + provisionStatus, err := GetClusterProvisionStatusOnSpecificNode(*storageNode) + var orignalTotalSize float64 + for _, pstatus := range provisionStatus { + if pstatus.NodeUUID == storageNode.Id { + orignalTotalSize += pstatus.TotalSize + } + } - resizeErr := Inst().V.ExpandPool(pooltoPick, api.SdkStoragePool_RESIZE_TYPE_RESIZE_DISK, 30000000, true) - dash.VerifyFatal(resizeErr, nil, "Verify error occurs with invalid Pool expansion size") + originalSizeInBytes = poolToResize.TotalSize + targetSizeInBytes = originalSizeInBytes + 100*units.GiB + targetSizeGiB = targetSizeInBytes / units.GiB - time.Sleep(2 * time.Minute) + log.InfoD("Current Size of the pool %s is %d GiB. Trying to expand to %v GiB with type add-disk", + poolIDToResize, poolToResize.TotalSize/units.GiB, targetSizeGiB) + triggerPoolExpansion(poolIDToResize, targetSizeGiB, api.SdkStoragePool_RESIZE_TYPE_ADD_DISK) + + Step("Ensure pool has been expanded to the expected size", func() { + err = waitForOngoingPoolExpansionToComplete(poolIDToResize) + dash.VerifyFatal(err, nil, "Pool expansion does not result in error") + verifyPoolSizeEqualOrLargerThanExpected(poolIDToResize, targetSizeGiB) + }) + + stNodes, err := GetStorageNodes() + log.FailOnError(err, "Unable to get the storage nodes") + var verifyNode node.Node + for _, node := range stNodes { + status, _ := IsPxRunningOnNode(&node) + if node.Id != storageNode.Id && status { + verifyNode = node + break + } + } + + // get final total size + provisionStatus, err = GetClusterProvisionStatusOnSpecificNode(verifyNode) + var finalTotalSize float64 + for _, pstatus := range provisionStatus { + if pstatus.NodeUUID == storageNode.Id { + finalTotalSize += pstatus.TotalSize + } + } + dash.VerifyFatal(finalTotalSize > orignalTotalSize, true, "Pool expansion failed, pool size is not greater than pool size before expansion") - // Verify error on pool expansion failure - match := checkPoolShowMessageOutput(storageNode) - dash.VerifyFatal(match, true, "Pool expand with invalid PoolUUID failed as expected.") }) }) var _ = Describe("{PoolExpandResizeWithSameSize}", func() { - - var testrailID = 34542944 - // testrailID corresponds to: https://portworx.testrail.net/index.php?/tests/view/34542944 + // TestrailId: https://portworx.testrail.net/index.php?/tests/view/34542944 BeforeEach(func() { StartTorpedoTest("PoolExpandResizeWithSameSize", - "Initiate pool expansion using same size", nil, testrailID) + "Initiate pool expansion using same size", nil, 34542944) }) AfterEach(func() { @@ -597,7 +827,7 @@ var _ = Describe("{PoolExpandResizeWithSameSize}", func() { var _ = Describe("{PoolExpandWhileResizeDiskInProgress}", func() { var testrailID = 34542896 - // testrailID corresponds to: https://portworx.testrail.net/index.php?/tests/view/34542896 + // TestrailId: https://portworx.testrail.net/index.php?/tests/view/34542896 BeforeEach(func() { StartTorpedoTest("PoolExpandWhileResizeDiskInProgress", @@ -650,7 +880,7 @@ var _ = Describe("{PoolExpandWhileResizeDiskInProgress}", func() { if !re.MatchString(fmt.Sprintf("%v", err)) { errMatch = fmt.Errorf("failed to verify pool expand when one already in progress") } - dash.VerifyFatal(errMatch, nil, "Pool expand with one resize already in Porgress failed as expected.") + dash.VerifyFatal(errMatch, nil, "Pool expand with one resize already in progress failed as expected.") Step("Ensure pool has been expanded to the expected size", func() { err = waitForOngoingPoolExpansionToComplete(poolIDToResize) @@ -846,14 +1076,14 @@ var _ = Describe("{PoolExpandResizeDiskInMaintenanceMode}", func() { log.InfoD(stepLog) var nodeDetail *node.Node var err error - stepLog = "Move node to maintenance mode" + stepLog = "Move Pool to maintenance mode" Step(stepLog, func() { log.InfoD(stepLog) nodeDetail, err = GetNodeWithGivenPoolID(poolToResize.Uuid) dash.VerifyFatal(err, nil, fmt.Sprintf("Failed to get Node Details using PoolUUID [%v]", poolToResize.Uuid)) - log.InfoD("Bring Node to Maintenance Mode") - err = Inst().V.EnterMaintenance(*nodeDetail) + log.InfoD("Bring Pool to Maintenance Mode") + err = Inst().V.EnterPoolMaintenance(*nodeDetail) dash.VerifyFatal(err, nil, fmt.Sprintf("Failed to shift Node [%s] to Mainteinance Mode", nodeDetail.Name)) }) @@ -873,8 +1103,8 @@ var _ = Describe("{PoolExpandResizeDiskInMaintenanceMode}", func() { stepLog = "Exit node out of maintenance mode" Step(stepLog, func() { log.InfoD(stepLog) - log.InfoD("Bring Node out of Maintenance Mode") - err = Inst().V.ExitMaintenance(*nodeDetail) + log.InfoD("Bring Pool out of Maintenance Mode") + err = Inst().V.ExitPoolMaintenance(*nodeDetail) dash.VerifyFatal(err, nil, fmt.Sprintf("Failed to shift Node [%s] out of Mainteinance Mode", nodeDetail.Name)) }) @@ -926,14 +1156,14 @@ var _ = Describe("{PoolExpandAddDiskInMaintenanceMode}", func() { log.InfoD(stepLog) var nodeDetail *node.Node var err error - stepLog = "Move node to maintenance mode" + stepLog = "Move pool to maintenance mode" Step(stepLog, func() { log.InfoD(stepLog) nodeDetail, err = GetNodeWithGivenPoolID(poolToResize.Uuid) dash.VerifyFatal(err, nil, fmt.Sprintf("Failed to get Node Details using PoolUUID [%v]", poolToResize.Uuid)) - log.InfoD("Bring Node to Maintenance Mode") - err = Inst().V.EnterMaintenance(*nodeDetail) + log.InfoD("Bring Pool to Maintenance Mode") + err = Inst().V.EnterPoolMaintenance(*nodeDetail) dash.VerifyFatal(err, nil, fmt.Sprintf("Failed to shift Node [%s] to Mainteinance Mode", nodeDetail.Name)) }) @@ -947,24 +1177,33 @@ var _ = Describe("{PoolExpandAddDiskInMaintenanceMode}", func() { log.InfoD("Current Size of the pool %s is %d GiB. Trying to expand to %v GiB with type add-disk", poolIDToResize, poolToResize.TotalSize/units.GiB, targetSizeGiB) err := Inst().V.ExpandPool(poolIDToResize, api.SdkStoragePool_RESIZE_TYPE_ADD_DISK, targetSizeGiB, true) - dash.VerifyFatal(err, nil, "pool expansion requested successfully") - }) - stepLog = "Exit node out of maintenance mode" - Step(stepLog, func() { - log.InfoD(stepLog) - log.InfoD("Bring Node out of Maintenance Mode") - err = Inst().V.ExitMaintenance(*nodeDetail) - dash.VerifyFatal(err, nil, fmt.Sprintf("Failed to shift Node [%s] out of Mainteinance Mode", nodeDetail.Name)) + if isDMthin, _ := IsDMthin(); isDMthin { + dash.VerifyFatal(err != nil, true, + "Pool expansion request of add-disk type should be rejected with dmthin") + dash.VerifyFatal(strings.Contains(err.Error(), "add-drive type expansion is not supported with px-storev2"), true, fmt.Sprintf("check error message: %v", err.Error())) + } else { + dash.VerifyFatal(err, nil, "pool expansion requested successfully") + } }) - stepLog = "Verify pool expand completes successfully" - Step(stepLog, func() { - log.InfoD(stepLog) - resizeErr := waitForOngoingPoolExpansionToComplete(poolIDToResize) - dash.VerifyFatal(resizeErr, nil, "Pool expansion does not result in error") - verifyPoolSizeEqualOrLargerThanExpected(poolIDToResize, targetSizeGiB) - }) + if isDMthin, _ := IsDMthin(); !isDMthin { + stepLog = "Exit Pool out of maintenance mode" + Step(stepLog, func() { + log.InfoD(stepLog) + log.InfoD("Bring Node out of Maintenance Mode") + err = Inst().V.ExitMaintenance(*nodeDetail) + dash.VerifyFatal(err, nil, fmt.Sprintf("Failed to shift Node [%s] out of Mainteinance Mode", nodeDetail.Name)) + }) + + stepLog = "Verify pool expand completes successfully" + Step(stepLog, func() { + log.InfoD(stepLog) + resizeErr := waitForOngoingPoolExpansionToComplete(poolIDToResize) + dash.VerifyFatal(resizeErr, nil, "Pool expansion does not result in error") + verifyPoolSizeEqualOrLargerThanExpected(poolIDToResize, targetSizeGiB) + }) + } }) }) @@ -1055,19 +1294,6 @@ var _ = Describe("{PoolExpandTestLimits}", func() { StartTorpedoTest("PoolExpandTestWithin15TiBLimit", "Initiate pool expansion using resize-disk to 15 TiB target size", nil, testrailID) - // To achieve total pool size of 15 TiB: - // 1. Add another drive of same size for pool to have 2 drives. - // 2. Perform resize-disk operation which is faster than pool rebalance - // due to adding a new 7 TiB drive. - targetSizeGiB := (poolToResize.TotalSize / units.GiB) * 2 - - log.InfoD("Next trying to expand the pool %s to %v GiB with type add-disk", - poolIDToResize, targetSizeGiB) - triggerPoolExpansion(poolIDToResize, targetSizeGiB, api.SdkStoragePool_RESIZE_TYPE_ADD_DISK) - resizeErr := waitForOngoingPoolExpansionToComplete(poolIDToResize) - dash.VerifyFatal(resizeErr, nil, "Pool expansion should not result in error") - verifyPoolSizeEqualOrLargerThanExpected(poolIDToResize, targetSizeGiB) - targetSizeTiB := uint64(15) targetSizeInBytes = targetSizeTiB * units.TiB targetSizeGiB = targetSizeInBytes / units.GiB @@ -1075,18 +1301,17 @@ var _ = Describe("{PoolExpandTestLimits}", func() { log.InfoD("Current Size of the pool %s is %d GiB. Trying to expand to %v TiB with type resize-disk", poolIDToResize, targetSizeGiB, targetSizeTiB) triggerPoolExpansion(poolIDToResize, targetSizeGiB, api.SdkStoragePool_RESIZE_TYPE_RESIZE_DISK) - resizeErr = waitForOngoingPoolExpansionToComplete(poolIDToResize) + resizeErr := waitForOngoingPoolExpansionToComplete(poolIDToResize) dash.VerifyFatal(resizeErr, nil, "Pool expansion should not result in error") verifyPoolSizeEqualOrLargerThanExpected(poolIDToResize, targetSizeGiB) }) - It("Expand pool to 20 TiB (beyond max supported capacity for DMThin) with add-disk type. ", func() { - var testrailID = 50643 - // testrailID corresponds to: https://portworx.testrail.net/index.php?/cases/view/50643 + It("Expand pool to 20 TiB (beyond max supported capacity for DMThin) with resize-disk type. ", func() { + // TestrailId: https://portworx.testrail.net/index.php?/cases/view/50643 StartTorpedoTest("DMThinPoolExpandBeyond15TiBLimit", - "Initiate pool expansion using add-disk to 20 TiB target size", nil, testrailID) + "Initiate pool expansion using resize-disk to 20 TiB target size", nil, testrailID) isDMthin, err := IsDMthin() dash.VerifyFatal(err, nil, "error verifying if set up is DMTHIN enabled") dash.VerifyFatal(isDMthin, true, "DMThin/PX-Storev2 is not enabled on underlaying PX cluster. Skipping `PoolExpandTestBeyond15TiBLimit` test.") @@ -1094,9 +1319,9 @@ var _ = Describe("{PoolExpandTestLimits}", func() { targetSizeTiB := uint64(20) targetSizeInBytes = targetSizeTiB * units.TiB targetSizeGiB = targetSizeInBytes / units.GiB - log.InfoD("Trying to expand pool %s to %v TiB with type add-disk", + log.InfoD("Trying to expand pool %s to %v TiB with type resize-disk", poolIDToResize, targetSizeTiB) - err = Inst().V.ExpandPool(poolIDToResize, api.SdkStoragePool_RESIZE_TYPE_ADD_DISK, targetSizeGiB, true) + err = Inst().V.ExpandPool(poolIDToResize, api.SdkStoragePool_RESIZE_TYPE_RESIZE_DISK, targetSizeGiB, true) dash.VerifyFatal(err != nil, true, "DMThin pool expansion to 20 TB should result in error") }) }) @@ -1189,7 +1414,7 @@ func checkPoolShowMessageOutput(n *node.Node) bool { for _, l := range outLines { line := strings.Trim(l, " ") // the following error is expected cause we are trying to expand the pool beyond the limit - if strings.Contains(line, "could not find a suitable storage distribution") { + if strings.Contains(line, "cannot be expanded beyond maximum size") { return true } } @@ -1535,11 +1760,9 @@ var _ = Describe("{PoolExpandStorageFullPoolResize}", func() { var testrailID = 34542835 // testrailID corresponds to: https://portworx.testrail.net/index.php?/tests/view/34542835 - var runID int JustBeforeEach(func() { StartTorpedoTest("PoolExpandStorageFullPoolResize", "Feed a pool full, then expand the pool using resize-disk", nil, testrailID) - runID = testrailuttils.AddRunsToMilestone(testrailID) }) var contexts []*scheduler.Context @@ -1633,7 +1856,9 @@ var _ = Describe("{PoolExpandStorageFullPoolResize}", func() { JustAfterEach(func() { defer EndTorpedoTest() - AfterEachTest(contexts, testrailID, runID) + // Cores are expected with StoragePool full. + // AfterEachTest will fail due to cores found during the test. + // AfterEachTest(contexts, testrailID, runID) }) }) diff --git a/tests/basic/pure_test.go b/tests/basic/pure_test.go index 85cb8b171..395060b43 100644 --- a/tests/basic/pure_test.go +++ b/tests/basic/pure_test.go @@ -2,6 +2,7 @@ package tests import ( "fmt" + "github.com/devans10/pugo/flasharray" "github.com/portworx/sched-ops/k8s/storage" @@ -2104,7 +2105,7 @@ var _ = Describe("{PVCLUNValidation}", func() { } for _, pvc := range pvcList.Items { - err := Inst().S.WaitForSinglePVCToBound(pvc.Name, nsName) + err := Inst().S.WaitForSinglePVCToBound(pvc.Name, nsName, 0) log.FailOnError(err, fmt.Sprintf("error validating PVC [%s] status in namespace [%s]", pvc.Name, nsName)) } @@ -2363,3 +2364,1979 @@ var _ = Describe("{FADAVolMigrateValidation}", func() { }) }) + +var _ = Describe("{VolAttachFAPxRestart}", func() { + /* + https://purestorage.atlassian.net/browse/PTX-21440 + 1. Create a host in the FA whose secret is not present in pure secret + 2. Create a volume and attach it to the host created in step 1 + 3. using iscsiadm commands run commands to login to the controllers + 4. check multipath -ll output + 5. Restart portworx + 6. The multipath entry for the volume attached from a different FA shouldn't vanish + */ + + JustBeforeEach(func() { + StartTorpedoTest("VolAttachFAPxRestart", "Attach a vol from a FA, restart portworx and check multipath consistency", nil, 0) + }) + + var ( + hostName = fmt.Sprintf("torpedo-host-%v", time.Now().UnixNano()) + volumeName = fmt.Sprintf("torpedo-vol-%v", time.Now().UnixNano()) + faSecret = Inst().FaSecret + FAclient *flasharray.Client + MultipathBeforeRestart string + faMgmtEndPoint string + faAPIToken string + host *flasharray.Host + IQNExists bool + ) + + itLog := "Attach a volume from a different FA, restart portworx and check multipath consistency" + It(itLog, func() { + log.InfoD(itLog) + // select a random node to run the test + n := node.GetStorageDriverNodes()[0] + + stepLog := "get the secrete of FA which is not present in pure secret" + Step(stepLog, func() { + log.InfoD(stepLog) + //get the flash array details + volDriverNamespace, err := Inst().V.GetVolumeDriverNamespace() + log.FailOnError(err, "failed to get volume driver [%s] namespace", Inst().V.String()) + + pxPureSecret, err := pureutils.GetPXPureSecret(volDriverNamespace) + log.FailOnError(err, "Failed to get secret %v", pxPureSecret) + flashArraysInSecret := pxPureSecret.Arrays + + if len(flashArraysInSecret) == 0 { + log.FailOnError(fmt.Errorf("no FlashArrays details found"), fmt.Sprintf("error getting FlashArrays creds from %s [%s]", PureSecretName, pxPureSecret)) + } + + for _, value := range strings.Split(faSecret, ",") { + faMgmtEndPoint = strings.Split(value, ":")[0] + faAPIToken = strings.Split(value, ":")[1] + if len(faMgmtEndPoint) == 0 || len(faAPIToken) == 0 { + continue + } + log.InfoD("famanagement endpoint: %v, faAPIToken: %v", faMgmtEndPoint, faAPIToken) + break + } + if len(faMgmtEndPoint) == 0 || len(faAPIToken) == 0 { + log.FailOnError(fmt.Errorf("no FlashArrays details found"), fmt.Sprintf("error getting FlashArrays creds from %s [%s]", PureSecretName, pxPureSecret)) + } + + for _, fa := range flashArraysInSecret { + if fa.MgmtEndPoint == faMgmtEndPoint { + log.FailOnError(fmt.Errorf("Flash Array details present in secret"), "Flash Array details should not be present in the secret") + } + } + }) + + stepLog = "Create a volume, create a host, attach the volume to the host, update iqn of the host and attach the volume to the host" + Step(stepLog, func() { + log.InfoD(stepLog) + + iqn, err := GetIQNOfNode(n) + log.FailOnError(err, "Failed to get iqn of the node %v", n.Name) + log.InfoD("Iqn of the node: %v", iqn) + + //create a connections to the FA whose credentials not present in the pure secret + FAclient, err = pureutils.PureCreateClientAndConnect(faMgmtEndPoint, faAPIToken) + log.FailOnError(err, "Failed to create client and connect to FA") + + // Check if the IQN of the node is present in the FA if present take the existing host else create one + IQNExists, err = pureutils.IsIQNExistsOnFA(FAclient, iqn) + log.FailOnError(err, "Failed to check if iqn exists on FA") + + if !IQNExists { + //create a host in the FA + host, err = pureutils.CreateNewHostOnFA(FAclient, hostName) + log.FailOnError(err, "Failed to create host on FA") + log.InfoD("Host created on FA: %v", host.Name) + + //Update iqn of the specific host + _, err = pureutils.UpdateIQNOnSpecificHosts(FAclient, hostName, iqn) + log.FailOnError(err, "Failed to update iqn on host %v", hostName) + log.InfoD("Updated iqn on host %v", hostName) + + } else { + // If iqn already exist in FA find the host which is using it + host, err = pureutils.GetHostFromIqn(FAclient, iqn) + log.FailOnError(err, "Failed to get host from FA") + log.InfoD("Host already exists on FA: %v", host) + } + + //create a volume on the FA + volSize := 1048576 * rand.Intn(10) + volume, err := pureutils.CreateVolumeOnFABackend(FAclient, volumeName, volSize) + log.FailOnError(err, "Failed to create volume on FA") + log.InfoD("Volume created on FA: %v", volume.Name) + + //Attach the volume to the host + connectedVolume, err := pureutils.ConnectVolumeToHost(FAclient, host.Name, volumeName) + log.FailOnError(err, "Failed to connect volume to host") + log.InfoD("Volume connected to host: %v", connectedVolume.Name) + + }) + stepLog = "Run iscsiadm commands to login to the controllers" + Step(stepLog, func() { + + //Run iscsiadm commands to login to the controllers + networkInterfaces, err := pureutils.GetSpecificInterfaceBasedOnServiceType(FAclient, "iscsi") + + for _, networkInterface := range networkInterfaces { + err = LoginIntoController(n, networkInterface, *FAclient) + log.FailOnError(err, "Failed to login into controller") + log.InfoD("Successfully logged into controller: %v", networkInterface.Address) + } + + // run multipath after login + cmd := "multipath -ll" + MultipathBeforeRestart, err = runCmd(cmd, n) + log.FailOnError(err, "Failed to run multipath -ll command on node %v", n.Name) + log.InfoD("Output of multipath -ll command before restart: %v", MultipathBeforeRestart) + + }) + + stepLog = "Restart portworx and check multipath consistency" + Step(stepLog, func() { + log.InfoD(stepLog) + err := Inst().V.StopDriver([]node.Node{n}, false, nil) + log.FailOnError(err, fmt.Sprintf("Failed to stop portworx on node [%s]", n.Name)) + err = Inst().V.WaitDriverDownOnNode(n) + log.FailOnError(err, fmt.Sprintf("Driver is up on node [%s]", n.Name)) + err = Inst().V.StartDriver(n) + log.FailOnError(err, fmt.Sprintf("Failed to start portworx on node [%s]", n.Name)) + err = Inst().V.WaitDriverUpOnNode(n, addDriveUpTimeOut) + log.FailOnError(err, fmt.Sprintf("Driver is down on node [%s]", n.Name)) + dash.VerifyFatal(err == nil, true, + fmt.Sprintf("PX is up after restarting on node [%s]", n.Name)) + + time.Sleep(10 * time.Second) + //run multipath after restart + cmd := "multipath -ll" + multipathAfterRestart, err := runCmd(cmd, n) + log.FailOnError(err, "Failed to run multipath -ll command on node %v", n.Name) + log.InfoD("Output of multipath -ll command after restart: %v", multipathAfterRestart) + + //check if the multipath entries are same before and after restart + dash.VerifyFatal(MultipathBeforeRestart == multipathAfterRestart, true, "Multipath entries are same before and after restart") + + }) + + stepLog = "Delete the volume and host from the FA" + Step(stepLog, func() { + log.InfoD(stepLog) + //log out of all the controllers + networkInterfaces, err := pureutils.GetSpecificInterfaceBasedOnServiceType(FAclient, "iscsi") + + for _, networkInterface := range networkInterfaces { + err = LogoutFromController(n, networkInterface, *FAclient) + log.FailOnError(err, "Failed to login into controller") + log.InfoD("Successfully logged out of controller: %v", networkInterface.Address) + } + + //disconnect volume from host + _, err = pureutils.DisConnectVolumeFromHost(FAclient, hostName, volumeName) + log.FailOnError(err, "Failed to disconnect volume from host") + log.InfoD("Volume disconnected from host: %v", volumeName) + + //Delete the volume + _, err = pureutils.DeleteVolumeOnFABackend(FAclient, volumeName) + log.FailOnError(err, "Failed to delete volume on FA") + log.InfoD("Volume deleted on FA: %v", volumeName) + + //Delete the host from FAbackend + if !IQNExists { + _, err = pureutils.DeleteHostOnFA(FAclient, hostName) + log.FailOnError(err, "Failed to delete host on FA") + log.InfoD("Host deleted on FA: %v", hostName) + } + }) + + }) + + JustAfterEach(func() { + defer EndTorpedoTest() + }) +}) + +func LoginIntoController(n node.Node, networkInterface flasharray.NetworkInterface, FAclient flasharray.Client) error { + ipAddress := networkInterface.Address + iqn, err := GetIQNOfFA(n, FAclient) + cmd := fmt.Sprintf("iscsiadm -m node -P %s -p %s -l", iqn, ipAddress) + iscsiAdmOutput, err := runCmd(cmd, n) + if err != nil { + return err + } + log.InfoD("Output of iscsiadm login command: %v", iscsiAdmOutput) + + return nil +} + +func LogoutFromController(n node.Node, networkInterface flasharray.NetworkInterface, FAclient flasharray.Client) error { + ipAddress := networkInterface.Address + iqn, err := GetIQNOfFA(n, FAclient) + cmd := fmt.Sprintf("iscsiadm -m node -P %s -p %s --logout", iqn, ipAddress) + iscsiAdmOutput, err := runCmd(cmd, n) + if err != nil { + return err + } + log.InfoD("Output of iscsiadm login command: %v", iscsiAdmOutput) + + return nil +} + +var _ = Describe("{VolAttachSameFAPxRestart}", func() { + /* + https://purestorage.atlassian.net/browse/PTX-21440 + 1. Create a host in the FA whose secret is in pure secret + 2. Create a volume and attach it to the host created in step 1 + 3. using iscsiadm commands run commands to login to the controllers + 4. check multipath -ll output + 5. Restart portworx + 6. The multipath entry for the volume attached from a different FA shouldn't vanish and I/O should be consistent + */ + + JustBeforeEach(func() { + StartTorpedoTest("VolAttachSameFAPxRestart", "Attach a vol from a FA, restart portworx and check multipath consistency", nil, 0) + }) + + var ( + hostName = fmt.Sprintf("torpedo-host-%v", time.Now().UnixNano()) + volumeName = fmt.Sprintf("torpedo-vol-%v", time.Now().UnixNano()) + FAclient *flasharray.Client + MultipathBeforeRestart string + faMgmtEndPoint string + faAPIToken string + host *flasharray.Host + volSize int + wg sync.WaitGroup + ) + + itLog := "Attach a volume from a different FA, restart portworx and check multipath consistency and I/O consistency" + It(itLog, func() { + log.InfoD(itLog) + // select a random node to run the test + n := node.GetStorageDriverNodes()[0] + + stepLog := "get the secrete of FA in pure secret" + Step(stepLog, func() { + log.InfoD(stepLog) + //get the flash array details + volDriverNamespace, err := Inst().V.GetVolumeDriverNamespace() + log.FailOnError(err, "failed to get volume driver [%s] namespace", Inst().V.String()) + + pxPureSecret, err := pureutils.GetPXPureSecret(volDriverNamespace) + log.FailOnError(err, "Failed to get secret %v", pxPureSecret) + flashArrays := pxPureSecret.Arrays + + if len(flashArrays) == 0 { + log.FailOnError(fmt.Errorf("no FlashArrays details found"), fmt.Sprintf("error getting FlashArrays creds from %s [%s]", PureSecretName, pxPureSecret)) + } + + faMgmtEndPoint = flashArrays[0].MgmtEndPoint + faAPIToken = flashArrays[0].APIToken + }) + + stepLog = "Create a volume, create a host, attach the volume to the host, update iqn of the host and attach the volume to the host" + Step(stepLog, func() { + log.InfoD(stepLog) + + iqn, err := GetIQNOfNode(n) + log.FailOnError(err, "Failed to get iqn of the node %v", n.Name) + log.InfoD("Iqn of the node: %v", iqn) + + //create a connections to the FA whose credentials not present in the pure secret + FAclient, err = pureutils.PureCreateClientAndConnect(faMgmtEndPoint, faAPIToken) + log.FailOnError(err, "Failed to create client and connect to FA") + + // Check if the IQN of the node is present in the FA if present take the existing host else create one + IQNExists, err := pureutils.IsIQNExistsOnFA(FAclient, iqn) + log.FailOnError(err, "Failed to check if iqn exists on FA") + + if !IQNExists { + //create a host in the FA + host, err = pureutils.CreateNewHostOnFA(FAclient, hostName) + log.FailOnError(err, "Failed to create host on FA") + log.InfoD("Host created on FA: %v", host.Name) + + //Update iqn of the specific host + _, err = pureutils.UpdateIQNOnSpecificHosts(FAclient, hostName, iqn) + log.FailOnError(err, "Failed to update iqn on host %v", hostName) + log.InfoD("Updated iqn on host %v", hostName) + + } else { + // If iqn already exist in FA find the host which is using it + host, err = pureutils.GetHostFromIqn(FAclient, iqn) + log.FailOnError(err, "Failed to get host from FA") + log.InfoD("Host already exists on FA: %v", host) + } + + //create a volume on the FA + volSize = 104857600000 * (rand.Intn(10) + 1) + volume, err := pureutils.CreateVolumeOnFABackend(FAclient, volumeName, volSize) + log.FailOnError(err, "Failed to create volume on FA") + log.InfoD("Volume created on FA: %v", volume.Name) + + //Attach the volume to the host + connectedVolume, err := pureutils.ConnectVolumeToHost(FAclient, host.Name, volumeName) + log.FailOnError(err, "Failed to connect volume to host") + log.InfoD("Volume connected to host: %v", connectedVolume.Name) + + }) + stepLog = "Run iscsiadm commands to login to the controllers" + Step(stepLog, func() { + + //run multipath before refresh + cmd := "multipath -ll" + output, err := runCmd(cmd, n) + log.FailOnError(err, "Failed to run multipath -ll command on node %v", n.Name) + log.InfoD("Output of multipath -ll command before PX restart : %v", output) + + // Refresh the iscsi session + err = RefreshIscsiSession(n) + log.FailOnError(err, "Failed to refresh iscsi session") + log.InfoD("Successfully refreshed iscsi session") + + //sleep for 10s for the entries to update + time.Sleep(10 * time.Second) + + // run multipath after login + cmd = "multipath -ll" + MultipathBeforeRestart, err = runCmd(cmd, n) + log.FailOnError(err, "Failed to run multipath -ll command on node %v", n.Name) + log.InfoD("Output of multipath -ll command before PX restart : %v", MultipathBeforeRestart) + + // multipath before and after shoouldn't be same + dash.VerifyFatal(MultipathBeforeRestart != output, true, "Multipath entries are different before and after refresh") + + }) + stepLog = "create ext4 file system on top of the volume,mount it to /home/test Start running fio on the volume" + Step(stepLog, func() { + log.InfoD(stepLog) + //Get the device path of the volume + cmd := "multipath -ll | grep dm- | sort -n | tail -n 1" + dm, err := runCmd(cmd, n) + log.FailOnError(err, "Failed to get the device path of the volume") + log.InfoD("Device path of the volume: %v", dm) + dmPath := strings.Fields(dm) + if len(dmPath) > 2 { + dm = dmPath[1] + } else { + log.FailOnError(fmt.Errorf("Failed to get the device path of the volume"), "Failed to get the device path of the volume") + } + //create ext4 file system on top of the volume + cmd = fmt.Sprintf("mkfs.ext4 /dev/%s", dm) + _, err = runCmd(cmd, n) + log.FailOnError(err, "Failed to create ext4 file system on the volume") + log.InfoD("Successfully created ext4 file system on the volume") + + //Mount the volume to /home/test + cmd = fmt.Sprintf("mkdir -p /home/test && mount /dev/%s /home/test", dm) + _, err = runCmd(cmd, n) + log.FailOnError(err, "Failed to mount the volume to /home/test") + log.InfoD("Successfully mounted the volume to /home/test") + + //pick a random name for a file to write data into + fileName := fmt.Sprintf("/home/test/fio-%v", time.Now().UnixNano()) + + //Create a file with the random name + cmd = fmt.Sprintf("touch %s", fileName) + _, err = runCmd(cmd, n) + log.FailOnError(err, "Failed to create a file with the random name") + log.InfoD("Successfully created a file with the random name") + + //run fio on the volume + + wg.Add(1) + go func() { + defer wg.Done() + fioCmd := fmt.Sprintf("fio --name=randwrite --ioengine=libaio --iodepth=32 --rw=randwrite --bs=4k --direct=1 --size=%vG --numjobs=1 --runtime=30 --time_based --group_reporting --filename=%s", volSize/2, fileName) + _, err = runCmd(fioCmd, n) + log.FailOnError(err, "Failed to run fio on the volume") + log.InfoD("Successfully ran fio on the volume") + }() + + }) + + stepLog = "Restart portworx and check multipath consistency" + Step(stepLog, func() { + log.InfoD(stepLog) + err := Inst().V.StopDriver([]node.Node{n}, false, nil) + log.FailOnError(err, fmt.Sprintf("Failed to stop portworx on node [%s]", n.Name)) + err = Inst().V.WaitDriverDownOnNode(n) + log.FailOnError(err, fmt.Sprintf("Driver is up on node [%s]", n.Name)) + err = Inst().V.StartDriver(n) + log.FailOnError(err, fmt.Sprintf("Failed to start portworx on node [%s]", n.Name)) + err = Inst().V.WaitDriverUpOnNode(n, addDriveUpTimeOut) + log.FailOnError(err, fmt.Sprintf("Driver is down on node [%s]", n.Name)) + dash.VerifyFatal(err == nil, true, + fmt.Sprintf("PX is up after restarting on node [%s]", n.Name)) + + //run multipath after restart + cmd := "multipath -ll" + multipathAfterRestart, err := runCmd(cmd, n) + log.FailOnError(err, "Failed to run multipath -ll command on node %v", n.Name) + + //check if the multipath entries are same before and after restart + dash.VerifyFatal(MultipathBeforeRestart == multipathAfterRestart, true, "Multipath entries are same before and after restart") + + }) + wg.Wait() + + stepLog = "Delete the volume and host from the FA" + Step(stepLog, func() { + log.InfoD(stepLog) + //disconnect volume from host + _, err = pureutils.DisConnectVolumeFromHost(FAclient, host.Name, volumeName) + log.FailOnError(err, "Failed to disconnect volume from host") + log.InfoD("Volume disconnected from host: %v", volumeName) + + //Delete the volume + _, err = pureutils.DeleteVolumeOnFABackend(FAclient, volumeName) + log.FailOnError(err, "Failed to delete volume on FA") + log.InfoD("Volume deleted on FA: %v", volumeName) + + //Refresh the iscsi session + err = RefreshIscsiSession(n) + log.FailOnError(err, "Failed to refresh iscsi session") + log.InfoD("Successfully refreshed iscsi session") + + }) + + }) + + JustAfterEach(func() { + defer EndTorpedoTest() + }) +}) + +/* +This test deploys app with FBDA volume having storageClass with pure_nfs_endpoint parameter. +It validates that FBDA volume gets consumed over IP mentioned in `pure_nfs_endpoint` parameter of storageClass. +*/ +var _ = Describe("{FBDAMultiTenancyBasicTest}", func() { + var contexts []*scheduler.Context + var testName string + var customConfigAppName string + + testName = "fbda-multitenancy" + JustBeforeEach(func() { + StartTorpedoTest("FBDAMultiTenancyBasicTest", "Validate FBDA vols get consumed over IP mentioned in `pure_nfs_endpoint` parameter of storageClass", nil, 0) + Step("setup credential necessary for cloudsnap", createCloudsnapCredential) + customConfigAppName = skipTestIfNoRequiredCustomAppConfigFound() + contexts = ScheduleApplications(testName) + for i := 0; i < len(contexts); i++ { + contexts[i].SkipVolumeValidation = true + } + ValidateApplicationsPureSDK(contexts) + }) + + When("pure_nfs_endpoint parameter specified in storageClass", func() { + It("should create a FBDA volume over pure_nfs_endpoint mentioned in storageClass", func() { + ctx := findContext(contexts, customConfigAppName) + + vols, err := Inst().S.GetVolumes(ctx) + dash.VerifyFatal(err, nil, "Failed to get list of volumes") + dash.VerifyFatal(len(vols) > 0, true, "Failed to get volumes") + + expectedPureNfsEndpoint := Inst().CustomAppConfig[customConfigAppName].StorageClassPureNfsEndpoint + + for _, vol := range vols { + apiVol, err := Inst().V.InspectVolume(vol.ID) + log.FailOnError(err, fmt.Sprintf("Failed to inspect volume [%s]", apiVol.GetId())) + // Validate the volume is created over the NFS endpoint mentioned in storageClass + dash.VerifyFatal(apiVol.Spec.ProxySpec.PureFileSpec.NfsEndpoint, expectedPureNfsEndpoint, "FBDA volume is not using NFS endpoint mentioned in storageClass.") + } + }) + + JustAfterEach(func() { + defer EndTorpedoTest() + opts := make(map[string]bool) + opts[scheduler.OptionsWaitForResourceLeakCleanup] = true + + for _, ctx := range contexts { + TearDownContext(ctx, opts) + } + Step("delete credential used for cloudsnap", deleteCloudsnapCredential) + AfterEachTest(contexts) + }) + }) +}) + +var _ = Describe("{FBDAMultiTenancyUpdatePureNFSEnpoint}", func() { + var contexts []*scheduler.Context + var customConfigAppName, originalNFSEndpoint string + var origCustomAppConfigs map[string]scheduler.AppConfig + + testName := "fbda-mt-update-endp" + + JustBeforeEach(func() { + StartTorpedoTest("FBDAMultiTenancyUpdatePureNFSEnpoint", "Validate Pure NFS endpoint can be changed using pxctl", nil, 0) + Step("setup credential necessary for cloudsnap", createCloudsnapCredential) + customConfigAppName = skipTestIfNoRequiredCustomAppConfigFound() + + // save the original custom app configs + origCustomAppConfigs = make(map[string]scheduler.AppConfig) + for appName, customAppConfig := range Inst().CustomAppConfig { + origCustomAppConfigs[appName] = customAppConfig + } + + // update the custom app config with empty string for Pure NFS endpoint + // So that app uses NFS endpoint from pure.json secret. + Inst().CustomAppConfig[customConfigAppName] = scheduler.AppConfig{ + StorageClassPureNfsEndpoint: "", + } + + log.Infof("JustBeforeEach using Inst().CustomAppConfig = %v", Inst().CustomAppConfig) + + err := Inst().S.RescanSpecs(Inst().SpecDir, Inst().V.String()) + log.FailOnError(err, fmt.Sprintf("Failed to rescan specs from %s", Inst().SpecDir)) + + contexts = ScheduleApplications(testName) + for i := 0; i < len(contexts); i++ { + contexts[i].SkipVolumeValidation = true + } + ValidateApplicationsPureSDK(contexts) + }) + + When("pure_nfs_endpoint is updated through pxctl", func() { + It("should use newer pure_nfs_endpoint during next FBDA volume mount", func() { + ctx := findContext(contexts, customConfigAppName) + vols, err := Inst().S.GetVolumes(ctx) + dash.VerifyFatal(err, nil, "Failed to get list of volumes") + dash.VerifyFatal(len(vols) > 0, true, "Failed to get volumes") + + newNFSEndpoint := origCustomAppConfigs[customConfigAppName].StorageClassPureNfsEndpoint + fbdaVolNames := []string{} + + for _, vol := range vols { + if backendType, ok := vol.Labels[k8s.PureDAVolumeLabel]; !ok || + backendType != k8s.PureDAVolumeLabelValueFB { + continue + } + fbdaVolNames = append(fbdaVolNames, vol.Name) + + apiVol, err := Inst().V.InspectVolume(vol.ID) + log.FailOnError(err, fmt.Sprintf("Failed to inspect volume [%s]", apiVol.GetId())) + + if apiVol.Spec != nil && apiVol.Spec.ProxySpec != nil { + if apiVol.Spec.ProxySpec.PureFileSpec != nil && apiVol.Spec.ProxySpec.PureFileSpec.NfsEndpoint != "" { + originalNFSEndpoint = apiVol.Spec.ProxySpec.PureFileSpec.NfsEndpoint + } else { + originalNFSEndpoint = apiVol.Spec.ProxySpec.Endpoint + } + } + dash.VerifyFatal(originalNFSEndpoint != newNFSEndpoint, true, + fmt.Sprintf("Verify new NFS endpoint [%s] is not same as old [%s].", newNFSEndpoint, originalNFSEndpoint)) + + err = Inst().V.UpdateFBDANFSEndpoint(apiVol.GetId(), newNFSEndpoint) + dash.VerifyFatal(err, nil, + fmt.Sprintf("Verify NFS endpoint is updated to [%s] through pxctl for volume [%s]", newNFSEndpoint, apiVol.GetId())) + } + + // Remount FBDA volumes by, + // scaling down app to 0 and then back to origial replica count. + originalAppScaleMap, err := scaleAppToZero(ctx) + dash.VerifyFatal(err, nil, fmt.Sprintf("Verify app [%s] is scaled down successfully. ", ctx.App.Key)) + + err = Inst().S.ScaleApplication(ctx, originalAppScaleMap) + dash.VerifyFatal(err, nil, fmt.Sprintf("Verify app [%s] is scaled up successfully.", ctx.App.Key)) + + for _, vol := range vols { + apiVol, err := Inst().V.InspectVolume(vol.ID) + log.FailOnError(err, fmt.Sprintf("Failed to inspect volume [%s]", apiVol.GetId())) + dash.VerifyFatal(apiVol.Spec.ProxySpec.PureFileSpec.NfsEndpoint, newNFSEndpoint, + "FBDA volume is using NFS endpoint set using pxctl.") + } + validateMountOnHost(ctx, newNFSEndpoint, fbdaVolNames) + }) + }) + + JustAfterEach(func() { + defer EndTorpedoTest() + opts := make(map[string]bool) + opts[scheduler.OptionsWaitForResourceLeakCleanup] = true + for _, ctx := range contexts { + TearDownContext(ctx, opts) + } + + // restore the original custom app configs + for appName, customAppConfig := range origCustomAppConfigs { + Inst().CustomAppConfig[appName] = customAppConfig + } + // remove any keys that are not present in the orig map + for appName := range Inst().CustomAppConfig { + if _, ok := origCustomAppConfigs[appName]; !ok { + delete(Inst().CustomAppConfig, appName) + } + } + log.Infof("JustAfterEach restoring Inst().CustomAppConfig = %v", Inst().CustomAppConfig) + err := Inst().S.RescanSpecs(Inst().SpecDir, Inst().V.String()) + Expect(err).NotTo(HaveOccurred(), "Failed to rescan specs from %s", Inst().SpecDir) + Step("delete credential used for cloudsnap", deleteCloudsnapCredential) + AfterEachTest(contexts) + }) +}) + +func validateMountOnHost(ctx *scheduler.Context, newNFSEndpoint string, fbdaVolNames []string) { + // For each node this app is running on, get the mount table. + // Then check for all FBDA volumes and validate they use the correct mount source. + appNodes, err := Inst().S.GetNodesForApp(ctx) + log.FailOnError(err, fmt.Sprintf("failed to get nodes for app: %v", ctx.App.Key)) + + for _, n := range appNodes { + mountOutput, err := Inst().N.RunCommand(n, "mount", node.ConnectionOpts{ + Timeout: k8s.DefaultTimeout, + TimeBeforeRetry: k8s.DefaultRetryInterval, + Sudo: true}) + log.FailOnError(err, fmt.Sprintf("failed to get mounts on node '%s': %v", n.Name, err)) + + for _, line := range strings.Split(mountOutput, "\n") { + if !strings.Contains(line, "nfs") { // Only consider NFS volumes + continue + } + + foundVol := "" + for _, volName := range fbdaVolNames { + if strings.Contains(line, volName) { + foundVol = volName + break + } + } + + if foundVol == "" { // Only consider volumes that are in our list of volume names + continue + } + + // Check that we are using the correct address + dash.VerifyFatal(strings.Contains(line, newNFSEndpoint), true, + fmt.Sprintf("Verify mount line for volume [%s] contains new NFS endpoint '%s'", foundVol, n.Name)) + } + } +} + +func scaleAppToZero(ctx *scheduler.Context) (map[string]int32, error) { + log.InfoD(fmt.Sprintf("scale down app %s to 0", ctx.App.Key)) + originalAppScaleMap := make(map[string]int32) + originalAppScaleMap, err := Inst().S.GetScaleFactorMap(ctx) + if err != nil { + return originalAppScaleMap, err + } + + applicationScaleDownMap := make(map[string]int32, len(ctx.App.SpecList)) + for name := range originalAppScaleMap { + applicationScaleDownMap[name] = 0 + } + + err = Inst().S.ScaleApplication(ctx, applicationScaleDownMap) + if err != nil { + return originalAppScaleMap, err + } + return originalAppScaleMap, nil +} + +func skipTestIfNoRequiredCustomAppConfigFound() string { + var customConfigAppName string + if Inst().CustomAppConfig == nil { + log.Warnf("No CustomAppConfig found, skipping test") + Skip("No CustomAppConfig found") + } + + log.Infof("Using CustomAppConfig: %+v", Inst().CustomAppConfig) + // Skip the test if we don't find any of our apps + for appNameFromCustomAppConfig := range Inst().CustomAppConfig { + found := false + for _, appName := range Inst().AppList { + if appName == appNameFromCustomAppConfig { + found = true + customConfigAppName = appNameFromCustomAppConfig + break + } + } + if !found { + log.Warnf("App %v not found in %d contexts, skipping test", appNameFromCustomAppConfig, len(contexts)) + Skip(fmt.Sprintf("app %v not found", appNameFromCustomAppConfig)) + } + } + return customConfigAppName +} + +var _ = Describe("{FADAPodRecoveryDisableDataPortsOnFA}", func() { + + /* + PTX : https://purestorage.atlassian.net/browse/PTX-23763 + Verify that FA Pods Recovers after bringing back network Interface down on all FA's + + */ + JustBeforeEach(func() { + log.Infof("Starting Torpedo tests ") + StartTorpedoTest("FADAPodRecoveryDisableDataPortsOnFA", + "Verify Pod Recovers from RO mode after Bounce after blocking network interface from FA end", + nil, 0) + }) + + itLog := "FADAPodRecoveryDisableDataPortsOnFA" + It(itLog, func() { + + var contexts []*scheduler.Context + var k8sCore = core.Instance() + + // Pick all the Volumes with RWO Status, We check if the Volume is with Access Mode RWO and PureBlock Volume + vols := make([]*volume.Volume, 0) + stepLog = "Schedule application" + Step(stepLog, func() { + contexts = make([]*scheduler.Context, 0) + for i := 0; i < Inst().GlobalScaleFactor; i++ { + contexts = append(contexts, ScheduleApplications(fmt.Sprintf("fapodrecovery-%d", i))...) + } + }) + + ValidateApplications(contexts) + defer appsValidateAndDestroy(contexts) + + flashArrayGetIscsiPorts := func() map[string][]string { + flashArrays, err := FlashArrayGetIscsiPorts() + log.FailOnError(err, "Failed to Get Details on Flasharray iscsi ports that are in Use ") + + return flashArrays + } + + interfaces := flashArrayGetIscsiPorts() + log.Infof("Map of List [%v]", interfaces) + + disableInterfaces := func() { + stepLog = "Disable all Data ports on the FA Controller" + Step(stepLog, func() { + for mgmtIp, iFaces := range interfaces { + for _, eachIface := range iFaces { + log.Infof("Disabling Network interfaces [%v] on FA Host [%v]", eachIface, mgmtIp) + log.FailOnError(DisableFlashArrayNetworkInterface(mgmtIp, eachIface), "Disabling network interface failed?") + } + } + }) + } + + enableInterfaces := func() { + stepLog = "Enable all Data ports on the FA Controller" + Step(stepLog, func() { + for mgmtIp, iFaces := range interfaces { + for _, eachIface := range iFaces { + log.Infof("Enabling Interface [%v] on FA Host [%v]", eachIface, mgmtIp) + log.FailOnError(EnableFlashArrayNetworkInterface(mgmtIp, eachIface), "Enabling Network interface failed?") + } + } + }) + } + + defer enableInterfaces() + + stepLog = "Get all Volumes and Validate " + Step(stepLog, func() { + for _, ctx := range contexts { + appVols, err := Inst().S.GetVolumes(ctx) + log.FailOnError(err, fmt.Sprintf("error getting volumes for app [%s]", ctx.App.Key)) + vols = append(vols, appVols...) + } + }) + + allStorageNodes := node.GetStorageNodes() + + stepLog = "Disable Data port on all FA's " + Step(stepLog, func() { + disableInterfaces() + }) + + // Sleep for sometime for PVC's to go in RO mode while data ingest in progress + time.Sleep(15 * time.Minute) + + // Verify Px goes down on all the nodes present in the cluster + for _, eachNodes := range allStorageNodes { + log.FailOnError(Inst().V.WaitDriverDownOnNode(eachNodes), fmt.Sprintf("Driver on the Node [%v] is not down yet", eachNodes.Name)) + } + + stepLog = "Verify if pods are not in Running state after disabling " + Step(stepLog, func() { + for _, eachVol := range vols { + // Pod details after blocking IP + podsOnBlock, err := k8sCore.GetPodsUsingPVC(eachVol.Name, eachVol.Namespace) + log.FailOnError(err, "unable to find the node from the pod") + + // Verify that Pod Bounces and not in Running state till the time iscsi rules are not reverted + for _, eachPodAfter := range podsOnBlock { + if eachPodAfter.Status.Phase == "Running" { + log.FailOnError(fmt.Errorf("pod is in Running State [%v]", + eachPodAfter.Status.HostIP), "Pod is in Running state") + } + log.Infof("Pod with Name [%v] placed on Host [%v] and Phase [%v]", + eachPodAfter.Name, eachPodAfter.Status.HostIP, eachPodAfter.Status.Phase) + } + } + }) + + // Enable Back the network interface on all the FA CLuster + enableInterfaces() + + // Sleep for some time for Px to come up online and working + time.Sleep(10 * time.Minute) + + stepLog = "Verify that each pods comes back online once network restored" + Step(stepLog, func() { + + }) + // Verify Px goes down on all the nodes present in the cluster + for _, eachNodes := range allStorageNodes { + log.FailOnError(Inst().V.WaitDriverUpOnNode(eachNodes, Inst().DriverStartTimeout), + fmt.Sprintf("Driver on the Node [%v] is not Up yet", eachNodes.Name)) + } + + stepLog = "Verify Each pod in Running State after bringing back data ports" + Step(stepLog, func() { + for _, eachVol := range vols { + // Pod details after blocking IP + podsAfterRevert, err := k8sCore.GetPodsUsingPVC(eachVol.Name, eachVol.Namespace) + log.FailOnError(err, "unable to find the node from the pod") + + for _, eachPod := range podsAfterRevert { + if eachPod.Status.Phase != "Running" { + log.FailOnError(fmt.Errorf("Pod didn't bounce on the node [%v]", + eachPod.Status.HostIP), "Pod didn't bounce on the node") + } + } + } + }) + + }) + + JustAfterEach(func() { + log.Infof("In Teardown") + defer EndTorpedoTest() + AfterEachTest(contexts) + }) +}) + +func pickRandomElementsFromArray(array []string, sampleCount int) []string { + // Seed the random number generator + rand.Seed(time.Now().UnixNano()) + + // Shuffle the slice + rand.Shuffle(len(array), func(i, j int) { + array[i], array[j] = array[j], array[i] + }) + + // Pick the first two elements + return array[:sampleCount] +} + +// Function to Enable Interfaces provided interface list +func enableInterfaces(interfaces map[string][]string) { + stepLog = "Enable all Data ports on the FA Controller" + Step(stepLog, func() { + for mgmtIp, iFaces := range interfaces { + for _, eachIface := range iFaces { + log.Infof("Enabling Interface [%v] on FA Host [%v]", eachIface, mgmtIp) + log.FailOnError(EnableFlashArrayNetworkInterface(mgmtIp, eachIface), "Enabling Network interface failed?") + } + } + }) +} + +// Function to disable Interfaces provided interface list +func disableInterfaces(interfaces map[string][]string) { + stepLog = "Disable all Data ports on the FA Controller" + Step(stepLog, func() { + for mgmtIp, iFaces := range interfaces { + for _, eachIface := range iFaces { + log.Infof("Disabling Network interfaces [%v] on FA Host [%v]", eachIface, mgmtIp) + log.FailOnError(DisableFlashArrayNetworkInterface(mgmtIp, eachIface), "Disabling network interface failed?") + } + } + }) +} + +// Do pool resize when few of the iscsi ports are down in FA +var _ = Describe("{PoolResizeFewIscsiPortsDown}", func() { + + /* + PTX : https://purestorage.atlassian.net/browse/PTX-23831 + Do pool resize when few of the iscsi ports are down in FA + + */ + JustBeforeEach(func() { + log.Infof("Starting Torpedo tests ") + StartTorpedoTest("PoolResizeFewIscsiPortsDown", + "Do pool resize when few of the iscsi ports are down in FA", + nil, 0) + }) + + itLog := "PoolResizeFewIscsiPortsDown" + It(itLog, func() { + var contexts []*scheduler.Context + //var k8sCore = core.Instance() + stepLog = "Schedule application" + Step(stepLog, func() { + contexts = make([]*scheduler.Context, 0) + for i := 0; i < Inst().GlobalScaleFactor; i++ { + contexts = append(contexts, ScheduleApplications(fmt.Sprintf("poolresizeiscsidown-%d", i))...) + } + }) + defer appsValidateAndDestroy(contexts) + + poolDetails := []*api.StoragePool{} + stepLog = "Get List of all storage pools present in the cluster" + Step(stepLog, func() { + poolsAvailable, err := Inst().V.ListStoragePools(metav1.LabelSelector{}) + log.FailOnError(err, "Failed to list storage pools") + log.Infof("List of pools present in the cluster [%v]", poolsAvailable) + for _, v := range poolsAvailable { + poolDetails = append(poolDetails, v) + } + }) + + // Pick Random Pool for Resize + randomPool := poolDetails[rand.Intn(len(poolDetails))] + log.Infof("Random pool picked for test [%v]", randomPool.GetUuid()) + + // Get Details of iscsi ports present in the cluster + flashArrays, err := FlashArrayGetIscsiPorts() + log.FailOnError(err, "Failed to Get Details on Flasharray iscsi ports that are in Use ") + + // Pick up random interfaces from each node leaving one interface to work + randomInterfaces := make(map[string][]string) + for MgmtIp, ifaces := range flashArrays { + if len(ifaces) == 1 { + Skip(fmt.Sprintf("only 1 interface present in the Backend FA. Skipping the test [%v]", "PoolResizeFewIscsiPortsDown")) + } else { + randomInterfaces[MgmtIp] = pickRandomElementsFromArray(ifaces, len(ifaces)-1) + } + } + + defer enableInterfaces(randomInterfaces) + + // Block Iptable Ports on each element + disableInterfaces(randomInterfaces) + + stepLog := "Initiate pool expansion drive using Resize type Auto " + Step(stepLog, func() { + log.InfoD(stepLog) + + poolToBeResized, err := GetStoragePoolByUUID(randomPool.Uuid) + log.FailOnError(err, fmt.Sprintf("Failed to get pool using UUID %s", randomPool.Uuid)) + drvSize, err := getPoolDiskSize(poolToBeResized) + log.FailOnError(err, "error getting drive size for pool [%s]", poolToBeResized.Uuid) + expectedSize := (poolToBeResized.TotalSize / units.GiB) + drvSize + + isjournal, err := IsJournalEnabled() + log.FailOnError(err, "Failed to check if Journal enabled") + + log.InfoD("Current Size of the pool %s is %d", randomPool.Uuid, poolToBeResized.TotalSize/units.GiB) + err = Inst().V.ExpandPool(randomPool.Uuid, api.SdkStoragePool_RESIZE_TYPE_AUTO, expectedSize, true) + dash.VerifyFatal(err, nil, "Pool expansion init successful?") + + err = WaitForExpansionToStart(poolToBeResized.Uuid) + log.FailOnError(err, "pool expansion not started") + + resizeErr := waitForPoolToBeResized(expectedSize, randomPool.Uuid, isjournal) + dash.VerifyFatal(resizeErr, nil, fmt.Sprintf("Verify pool %s expansion using resize-disk", randomPool.Uuid)) + + }) + + }) + JustAfterEach(func() { + log.Infof("In Teardown") + defer EndTorpedoTest() + AfterEachTest(contexts) + }) +}) + +// Do pool resize when all the iscsi ports are down in FA +var _ = Describe("{PoolResizeAllIscsiPortsDown}", func() { + + /* + PTX : https://purestorage.atlassian.net/browse/PTX-23832 + Do pool resize when all of iscsi ports are down in FA + + */ + JustBeforeEach(func() { + log.Infof("Starting Torpedo tests ") + StartTorpedoTest("PoolResizeAllIscsiPortsDown", + "Do pool resize when all of iscsi ports are down in FA", + nil, 0) + }) + + itLog := "PoolResizeAllIscsiPortsDown" + It(itLog, func() { + var contexts []*scheduler.Context + //var k8sCore = core.Instance() + stepLog = "Schedule application" + Step(stepLog, func() { + contexts = make([]*scheduler.Context, 0) + for i := 0; i < Inst().GlobalScaleFactor; i++ { + contexts = append(contexts, ScheduleApplications(fmt.Sprintf("poolresizeiscsidown-%d", i))...) + } + }) + defer appsValidateAndDestroy(contexts) + + poolDetails := []*api.StoragePool{} + stepLog = "Get List of all storage pools present in the cluster" + Step(stepLog, func() { + poolsAvailable, err := Inst().V.ListStoragePools(metav1.LabelSelector{}) + log.FailOnError(err, "Failed to list storage pools") + log.Infof("List of pools present in the cluster [%v]", poolsAvailable) + for _, v := range poolsAvailable { + poolDetails = append(poolDetails, v) + } + }) + + // Pick Random Pool for Resize + randomPool := poolDetails[rand.Intn(len(poolDetails))] + log.Infof("Random pool picked for test [%v]", randomPool.GetUuid()) + + // Get Details of iscsi ports present in the cluster + flashArrays, err := FlashArrayGetIscsiPorts() + log.FailOnError(err, "Failed to Get Details on Flasharray iscsi ports that are in Use ") + + defer enableInterfaces(flashArrays) + + stepLog := "Initiate pool expansion drive and restart PX" + Step(stepLog, func() { + log.InfoD(stepLog) + + poolToBeResized, err := GetStoragePoolByUUID(randomPool.Uuid) + log.FailOnError(err, fmt.Sprintf("Failed to get pool using UUID %s", randomPool.Uuid)) + drvSize, err := getPoolDiskSize(poolToBeResized) + log.FailOnError(err, "error getting drive size for pool [%s]", poolToBeResized.Uuid) + expectedSize := (poolToBeResized.TotalSize / units.GiB) + drvSize + + // Block Iptable Ports on each element + disableInterfaces(flashArrays) + + // Sleep for 2 min before proceeding to Pool Expansion + time.Sleep(2 * time.Minute) + + log.InfoD("Current Size of the pool %s is %d", randomPool.Uuid, poolToBeResized.TotalSize/units.GiB) + err = Inst().V.ExpandPool(randomPool.Uuid, api.SdkStoragePool_RESIZE_TYPE_AUTO, expectedSize, true) + log.Infof("Pool Expansion status [%v]", err) + if err == nil { + log.FailOnError(fmt.Errorf("Pool expansion completed even if all iscsi ports are down"), "pool expansion completed ?") + } + }) + + // Enable Back network interfaces on all the nodes + enableInterfaces(flashArrays) + + // Wait for Px to come up + // Verify Px goes down on all the nodes present in the cluster + for _, eachNodes := range node.GetStorageNodes() { + log.FailOnError(Inst().V.WaitDriverUpOnNode(eachNodes, Inst().DriverStartTimeout), + fmt.Sprintf("Driver on the Node [%v] is not Up yet", eachNodes.Name)) + } + + // Retry Pool Expand again after px comes up + stepLog = "Initiate pool expansion drive and restart PX" + Step(stepLog, func() { + log.InfoD(stepLog) + + poolToBeResized, err := GetStoragePoolByUUID(randomPool.Uuid) + log.FailOnError(err, fmt.Sprintf("Failed to get pool using UUID %s", randomPool.Uuid)) + drvSize, err := getPoolDiskSize(poolToBeResized) + log.FailOnError(err, "error getting drive size for pool [%s]", poolToBeResized.Uuid) + expectedSize := (poolToBeResized.TotalSize / units.GiB) + drvSize + + isjournal, err := IsJournalEnabled() + log.FailOnError(err, "Failed to check if Journal enabled") + + log.InfoD("Current Size of the pool %s is %d", randomPool.Uuid, poolToBeResized.TotalSize/units.GiB) + err = Inst().V.ExpandPool(randomPool.Uuid, api.SdkStoragePool_RESIZE_TYPE_AUTO, expectedSize, true) + dash.VerifyFatal(err, nil, "Pool expansion init successful?") + + err = WaitForExpansionToStart(poolToBeResized.Uuid) + log.FailOnError(err, "pool expansion not started") + + resizeErr := waitForPoolToBeResized(expectedSize, randomPool.Uuid, isjournal) + dash.VerifyFatal(resizeErr == nil, true, fmt.Sprintf("Verify pool %s expansion using resize-disk", randomPool.Uuid)) + + }) + + }) + JustAfterEach(func() { + log.Infof("In Teardown") + defer EndTorpedoTest() + AfterEachTest(contexts) + }) +}) + +// Do pool resize when all the iscsi ports are down in FA +var _ = Describe("{IscsiPortsDownDuringPoolExpandInProgress}", func() { + + /* + PTX : https://purestorage.atlassian.net/browse/PTX-23835 + bring iscsi port down when pool expansion in progress + + */ + JustBeforeEach(func() { + log.Infof("Starting Torpedo tests ") + StartTorpedoTest("IscsiPortsDownDuringPoolExpandInProgress", + "bring all iscsi port down when pool expansion in progress", + nil, 0) + }) + + itLog := "IscsiPortsDownDuringPoolExpandInProgress" + It(itLog, func() { + var contexts []*scheduler.Context + //var k8sCore = core.Instance() + stepLog = "Schedule application" + Step(stepLog, func() { + contexts = make([]*scheduler.Context, 0) + for i := 0; i < Inst().GlobalScaleFactor; i++ { + contexts = append(contexts, ScheduleApplications(fmt.Sprintf("poolresizeiscsidown-%d", i))...) + } + }) + defer appsValidateAndDestroy(contexts) + + poolDetails := []*api.StoragePool{} + stepLog = "Get List of all storage pools present in the cluster" + Step(stepLog, func() { + poolsAvailable, err := Inst().V.ListStoragePools(metav1.LabelSelector{}) + log.FailOnError(err, "Failed to list storage pools") + log.Infof("List of pools present in the cluster [%v]", poolsAvailable) + for _, v := range poolsAvailable { + poolDetails = append(poolDetails, v) + } + }) + + // Pick Random Pool for Resize + randomPool := poolDetails[rand.Intn(len(poolDetails))] + log.Infof("Random pool picked for test [%v]", randomPool.GetUuid()) + + // Get Details of iscsi ports present in the cluster + flashArrays, err := FlashArrayGetIscsiPorts() + log.FailOnError(err, "Failed to Get Details on Flasharray iscsi ports that are in Use ") + + defer enableInterfaces(flashArrays) + + // Wait for Px to come up + // Verify Px goes down on all the nodes present in the cluster + storageNodes := node.GetStorageNodes() + for _, eachNodes := range storageNodes { + log.FailOnError(Inst().V.WaitDriverUpOnNode(eachNodes, Inst().DriverStartTimeout), + fmt.Sprintf("Driver on the Node [%v] is not Up yet", eachNodes.Name)) + } + + // Retry Pool Expand again after px comes up + stepLog = "Initiate pool expansion drives" + Step(stepLog, func() { + log.InfoD(stepLog) + + poolToBeResized, err := GetStoragePoolByUUID(randomPool.Uuid) + log.FailOnError(err, fmt.Sprintf("Failed to get pool using UUID %s", randomPool.Uuid)) + drvSize, err := getPoolDiskSize(poolToBeResized) + log.FailOnError(err, "error getting drive size for pool [%s]", poolToBeResized.Uuid) + expectedSize := (poolToBeResized.TotalSize / units.GiB) + drvSize + + isjournal, err := IsJournalEnabled() + log.FailOnError(err, "Failed to check if Journal enabled") + + log.InfoD("Current Size of the pool %s is %d", randomPool.Uuid, poolToBeResized.TotalSize/units.GiB) + err = Inst().V.ExpandPool(randomPool.Uuid, api.SdkStoragePool_RESIZE_TYPE_AUTO, expectedSize, true) + dash.VerifyFatal(err, nil, "Pool expansion init successful?") + + err = WaitForExpansionToStart(poolToBeResized.Uuid) + log.FailOnError(err, "pool expansion not started") + + // Block Iptable Ports on each element + disableInterfaces(flashArrays) + + // Verify Px goes down on all the nodes present in the cluster + for _, eachNodes := range storageNodes { + log.FailOnError(Inst().V.WaitDriverDownOnNode(eachNodes), fmt.Sprintf("Driver on the Node [%v] is not down yet", eachNodes.Name)) + } + + // Enable Back network interfaces on all the nodes + enableInterfaces(flashArrays) + + // Verify Px goes down on all the nodes present in the cluster + for _, eachNodes := range node.GetStorageNodes() { + log.FailOnError(Inst().V.WaitDriverUpOnNode(eachNodes, Inst().DriverStartTimeout), + fmt.Sprintf("Driver on the Node [%v] is not Up yet", eachNodes.Name)) + } + + // Wait for Pool to be resized + resizeErr := waitForPoolToBeResized(expectedSize, randomPool.Uuid, isjournal) + log.Infof("%v", resizeErr) + dash.VerifyFatal(resizeErr == nil, true, fmt.Sprintf("Verify pool %s expansion using resize-disk", randomPool.Uuid)) + + }) + + }) + JustAfterEach(func() { + log.Infof("In Teardown") + defer EndTorpedoTest() + AfterEachTest(contexts) + }) +}) + +var _ = Describe("{IscsiPortsDownDuringNewPoolCreateInProgress}", func() { + + /* + PTX : https://purestorage.atlassian.net/browse/PTX-23835 + bring iscsi port down when pool Creation in progress + + */ + JustBeforeEach(func() { + log.Infof("Starting Torpedo tests ") + StartTorpedoTest("IscsiPortsDownDuringNewPoolCreateInProgress", + "bring all iscsi port down when New Pool Creation in progress", + nil, 0) + }) + + itLog := "IscsiPortsDownDuringNewPoolCreateInProgress" + It(itLog, func() { + var contexts []*scheduler.Context + var wg sync.WaitGroup + + //var k8sCore = core.Instance() + stepLog = "Schedule application" + Step(stepLog, func() { + contexts = make([]*scheduler.Context, 0) + for i := 0; i < Inst().GlobalScaleFactor; i++ { + contexts = append(contexts, ScheduleApplications(fmt.Sprintf("poolresizeiscsidown-%d", i))...) + } + }) + defer appsValidateAndDestroy(contexts) + + poolId, err := GetPoolIDWithIOs(contexts) + log.FailOnError(err, "Failed to Get Details of pool with Running IO") + + // Get the list of nodes present in the cluster + nodeId, err := GetNodeFromPoolUUID(poolId) + log.FailOnError(err, fmt.Sprintf("Failed to Get Details of Node with Pool UUID [%v]", poolId)) + + // Get Details of iscsi ports present in the cluster + flashArrays, err := FlashArrayGetIscsiPorts() + log.FailOnError(err, "Failed to Get Details on Flasharray iscsi ports that are in Use ") + + defer enableInterfaces(flashArrays) + + // Wait for Px to come up + // Verify Px goes down on all the nodes present in the cluster + storageNodes := node.GetStorageNodes() + for _, eachNodes := range storageNodes { + log.FailOnError(Inst().V.WaitDriverUpOnNode(eachNodes, Inst().DriverStartTimeout), + fmt.Sprintf("Driver on the Node [%v] is not Up yet", eachNodes.Name)) + } + + createNewPool := func(selectedNode *node.Node) { + defer wg.Done() + defer GinkgoRecover() + newSpec := "size=250" + err = Inst().V.AddCloudDrive(selectedNode, newSpec, -1) + log.FailOnError(err, fmt.Sprintf("Add cloud drive failed on node %s", selectedNode.Name)) + } + + stepLog = "Initiate New Pool Creation on the node" + Step(stepLog, func() { + log.InfoD(stepLog) + + // Get List of Pools present in the cluster + poolDetails := []*api.StoragePool{} + poolsAvailable, err := Inst().V.ListStoragePools(metav1.LabelSelector{}) + log.FailOnError(err, "Failed to list storage pools") + log.Infof("List of pools present in the cluster [%v]", poolsAvailable) + for _, v := range poolsAvailable { + poolDetails = append(poolDetails, v) + } + + wg.Add(1) + go createNewPool(nodeId) + + time.Sleep(20 * time.Second) + + // Block Iptable Ports on each element + disableInterfaces(flashArrays) + wg.Wait() + time.Sleep(10 * time.Minute) + + // Enable Back network interfaces on all the nodes + enableInterfaces(flashArrays) + + // Verify Px goes down on all the nodes present in the cluster + for _, eachNodes := range node.GetStorageNodes() { + log.FailOnError(Inst().V.WaitDriverUpOnNode(eachNodes, Inst().DriverStartTimeout), + fmt.Sprintf("Driver on the Node [%v] is not Up yet", eachNodes.Name)) + } + + // Get List of Pools present in the cluster + poolDetailsAfterEnable := []*api.StoragePool{} + poolsAvailableAfterEnable, err := Inst().V.ListStoragePools(metav1.LabelSelector{}) + log.FailOnError(err, "Failed to list storage pools") + log.Infof("List of pools present in the cluster [%v]", poolsAvailableAfterEnable) + for _, v := range poolsAvailableAfterEnable { + poolDetailsAfterEnable = append(poolDetailsAfterEnable, v) + } + + // Comparing if new pool is created + dash.VerifyFatal(len(poolDetailsAfterEnable) > len(poolDetails), true, "New pool created ?") + }) + + }) + JustAfterEach(func() { + log.Infof("In Teardown") + defer EndTorpedoTest() + AfterEachTest(contexts) + }) +}) + +var _ = Describe("{FBDATopologyCreateTest}", func() { + var scName, ns, pvcName, pureNfsEndpoint string + JustBeforeEach(func() { + StartTorpedoTest("FBDATopologyCreateTest", + "Try Creating FBDA pvcs using various topology options", nil, 0) + customConfigAppName := skipTestIfNoRequiredCustomAppConfigFound() + pureNfsEndpoint = Inst().CustomAppConfig[customConfigAppName].StorageClassPureNfsEndpoint + }) + itLog := "FBDATopologyCreateTest" + It(itLog, func() { + createSC := func(scName, pureNfsEndpoint string, allowedTopologies map[string][]string) { + + params := make(map[string]string) + params["repl"] = "1" + params["priority_io"] = "high" + params["io_profile"] = "auto" + params["backend"] = "pure_file" + params["pure_nfs_endpoint"] = pureNfsEndpoint + bindMode := storageApi.VolumeBindingImmediate + + storage.Instance().DeleteStorageClass(scName) + time.Sleep(1 * time.Second) + var allowVolExpansion bool = true + err := CreateFlashStorageClass(scName, "pure_file", + v1.PersistentVolumeReclaimDelete, + params, []string{}, + &allowVolExpansion, bindMode, allowedTopologies) + dash.VerifyFatal(err, nil, + "Verify storage class is created successfully with topology labels") + } + + scName, ns, pvcName = "fbda-topology-sc", "testns", "pvcwithtop" + + type testCases struct { + allowedTopologies map[string][]string + isErrorExpected bool + } + testCases1 := []testCases{ + { + allowedTopologies: map[string][]string{ + k8s.TopologyZoneK8sNodeLabel: {"zone-0"}, + k8s.TopologyRegionK8sNodeLabel: {"region-0"}, + }, + isErrorExpected: false, + }, + { + allowedTopologies: map[string][]string{ + k8s.TopologyZoneK8sNodeLabel: {"zone-0"}, + }, + isErrorExpected: true, + }, + { + allowedTopologies: nil, + isErrorExpected: true, + }, + } + + for i, t := range testCases1 { + log.Infof("Running test case [%d]\n", i) + createSC(scName, pureNfsEndpoint, t.allowedTopologies) + + ns, err := CreateNamespaces(ns, 1) + log.FailOnError(err, fmt.Sprintf("error creating namespace [%s] failed [%v]", ns, err)) + + err = CreateFlashPVCOnCluster(pvcName, scName, ns[0], "5Gi") + dash.VerifyFatal(err, nil, fmt.Sprintf("Verify PVC [%s] is created successfully", pvcName)) + + time.Sleep(10 * time.Second) + pvc, err := core.Instance().GetPersistentVolumeClaim(pvcName, ns[0]) + log.FailOnError(err, "Failed to create PVC [%v]. Error : [%v]", pvcName, err) + err = Inst().S.WaitForSinglePVCToBound(pvcName, ns[0], 3) + + if !t.isErrorExpected { + dash.VerifyFatal(err, nil, fmt.Sprintf("Verify PVC [%s] got bound successfully.", pvc.Name)) + } else { + dash.VerifyFatal(err != nil, true, fmt.Sprintf("Verify PVC [%s] fails to get bound.", pvc.Name)) + } + err = storage.Instance().DeleteStorageClass(scName) + log.FailOnError(err, fmt.Sprintf("error deleting storage class [%s]", scName)) + err = core.Instance().DeletePersistentVolumeClaim(pvcName, ns[0]) + log.FailOnError(err, fmt.Sprintf("error deleting PVC [%s] in [%s] namespace", pvcName, ns[0])) + err = core.Instance().DeleteNamespace(ns[0]) + log.FailOnError(err, fmt.Sprintf("error deleting namespace [%s]", ns[0])) + time.Sleep(30 * time.Second) + } + }) + JustAfterEach(func() { + defer func() { + + EndTorpedoTest() + }() + }) +}) + +var _ = Describe("{DeleteFADAVolumeFromBackend}", func() { + + /* + PTX : https://purestorage.atlassian.net/browse/PTX-23835 + Px Should throw proper error message when backend volumes from FA is deleted + + */ + JustBeforeEach(func() { + log.Infof("Starting Torpedo tests ") + StartTorpedoTest("DeleteFADAVolumeFromBackend", + "Delete FADA volume from Backend and verify Pod status once volume deleted", + nil, 0) + }) + + itLog := "DeleteFADAVolumeFromBackend" + It(itLog, func() { + var contexts []*scheduler.Context + + //var k8sCore = core.Instance() + stepLog = "Schedule application" + Step(stepLog, func() { + contexts = make([]*scheduler.Context, 0) + for i := 0; i < Inst().GlobalScaleFactor; i++ { + contexts = append(contexts, ScheduleApplications(fmt.Sprintf("poolresizeiscsidown-%d", i))...) + } + }) + //ValidateApplications(contexts) + defer appsValidateAndDestroy(contexts) + + allPureVolumes := []volume.Volume{} + + // Get all the volumes with IO running + for _, eachCtx := range contexts { + volumes, err := Inst().S.GetVolumes(eachCtx) + log.FailOnError(err, "Failed to get list of all volumes") + + pureVols, err := FilterAllPureVolumes(volumes) + log.FailOnError(err, "Failed to get list of pure volumes") + + allPureVolumes = append(allPureVolumes, pureVols...) + } + + // Pick a Random Volume with IO + randomIndex := rand.Intn(len(allPureVolumes)) + pickVolume := allPureVolumes[randomIndex] + log.InfoD("Volume picked for deletion is [%v] with ID [%v]", pickVolume.Name, pickVolume.ID) + + pvc, err := GetPVCObjFromVol(&pickVolume) + log.FailOnError(err, "Failed to get details about the PVC") + log.Infof("PVC Name for the volume [%v] is [%v]", pvc.Spec.VolumeName, pvc.Name) + + // Pod details after blocking IP + podsOnBlock, err := k8sCore.GetPodsUsingPVC(pvc.Name, pvc.Namespace) + log.FailOnError(err, "unable to find the node from the pod") + + // Verify that Pod Bounces and not in Running state till the time iscsi rules are not reverted + for _, eachPodAfter := range podsOnBlock { + log.Infof("Pod [%v] is in State [%v]", eachPodAfter.Name, eachPodAfter.Status.Phase) + } + + log.Infof("Deleting the PVC [%v] from FA Backend", pickVolume.ID) + faDetails, err := GetFADetailsFromVolumeName(pickVolume.ID) + log.FailOnError(err, "Failed to get list of all volumes") + + for _, eachFA := range faDetails { + log.Infof("Delete volume [%v] with Name [%v] from FA Backend [%v] returned error", pickVolume.Name, pickVolume.ID, eachFA) + deleted, err := DeleteVolumeFromFABackend(eachFA, pickVolume.ID) + log.FailOnError(err, "delete volume [%v] from FA Backend [%v] returned error", pickVolume.Name, eachFA) + dash.VerifyFatal(deleted, true, "is volume deleted from backend") + } + + // Sleep for some time after deleting the PVC + time.Sleep(15 * time.Minute) + + // Pod details after blocking IP + podsAfter, err := k8sCore.GetPodsUsingPVC(pvc.Name, pvc.Namespace) + log.FailOnError(err, "unable to find the node from the pod") + + // Verify that Pod Bounces and not in Running state till the time iscsi rules are not reverted + // TODO : Exact behaviour not known ( https://purestorage.atlassian.net/browse/PWX-37170 ) + // The function below will be updated later once the issue is fixed + for _, eachPodAfter := range podsAfter { + if eachPodAfter.Status.Phase == "Running" { + log.FailOnError(fmt.Errorf("Pod [%v] still in Running state even after backend volumes are deleted", eachPodAfter.Name), "is Pod still running ?") + } + } + }) + + JustAfterEach(func() { + log.Infof("In Teardown") + defer EndTorpedoTest() + AfterEachTest(contexts) + }) + +}) + +var _ = Describe("{ExpandMultiplePoolsWhenFADAVolumeCreationInProgress}", func() { + + /* + https://purestorage.atlassian.net/browse/PTX-23977 + Expand multiple pools in parallel , when lots of FADA Volumes are being created + + */ + JustBeforeEach(func() { + log.Infof("Starting Torpedo tests ") + StartTorpedoTest("CreateNewPoolWhenFADAVolumeCreationInProgress", + "Automate Scenario Create new pools when lots of Create / Delete FADA Volumes are in progress", + nil, 0) + }) + + itLog := "ExpandMultiplePoolsWhenFADAVolumeCreationInProgress" + It(itLog, func() { + + // Create Namespace on the cluster + nsuuid := uuid.New() + nsName := fmt.Sprintf("fada-ns-%s", nsuuid.String()) + + log.Infof("Create Namespace with Name [%v]", nsName) + namespace, err := CreateNamespaces(nsName, 1) + log.FailOnError(err, "Failed to create Namespace") + + deleteNamespaces := func() { + log.Infof("Deleting Namespaces created during test [%v]", namespace) + err := DeleteNamespaces(namespace) + log.FailOnError(err, fmt.Sprintf("Failed to Delete namespaces [%v]", namespace)) + } + defer deleteNamespaces() + + // Create Storage Class + scName := fmt.Sprintf("fada-sc-%s", nsuuid.String()) + log.Infof("Create Storage class with Name [%v]", scName) + var allowVolExpansion bool = true + err = CreateFlashStorageClass(scName, + "pure_block", + v1.PersistentVolumeReclaimDelete, + nil, nil, &allowVolExpansion, + storageApi.VolumeBindingImmediate, + nil) + log.FailOnError(err, fmt.Sprintf("Failed to create storage class [%v] ", scName)) + + var wgfada sync.WaitGroup + wgfada.Add(1) + createFADAVolumes := func(wg *sync.WaitGroup) { + defer GinkgoRecover() + wg.Done() + for _, eachNs := range namespace { + // Create 100 PVCs on the Namespace + for i := 0; i < 100; i++ { + pvcName := fmt.Sprintf("fada-pvc-%d-%s", i, nsuuid.String()) + log.FailOnError(CreateFlashPVCOnCluster(pvcName, scName, eachNs, "100"), + "Failed to create PVC on the cluster") + + log.FailOnError(Inst().S.WaitForSinglePVCToBound(pvcName, eachNs, 0), + "Errored occured while checking if PVC Bounded") + + } + } + } + + // Expand Pools on all available Nodes while Volume Creation in Progress + poolIdsToExpand := []string{} + for _, eachNodes := range node.GetStorageNodes() { + pools, err := GetPoolsDetailsOnNode(&eachNodes) + // Get random Pool + randomIndex := rand.Intn(len(pools)) + pickPool := pools[randomIndex] + if err == nil { + poolIdsToExpand = append(poolIdsToExpand, pickPool.Uuid) + } else { + log.InfoD("Errored while getting Pool IDs , ignoring for now ...") + } + } + dash.VerifyFatal(len(poolIdsToExpand) > 0, true, + fmt.Sprintf("No pools with IO present ?")) + + go createFADAVolumes(&wgfada) + + expandType := []api.SdkStoragePool_ResizeOperationType{api.SdkStoragePool_RESIZE_TYPE_ADD_DISK} + if !IsPoolAddDiskSupported() { + expandType = []api.SdkStoragePool_ResizeOperationType{api.SdkStoragePool_RESIZE_TYPE_RESIZE_DISK} + } + wg, err := ExpandMultiplePoolsInParallel(poolIdsToExpand, 100, expandType) + dash.VerifyFatal(err, nil, "Pool expansion in parallel failed") + + wg.Wait() + wgfada.Wait() + + // Get List of all PVCs created on the Namespace + pvcs, err := GetAllPVCFromNs(namespace[0], nil) + log.FailOnError(err, "Failed to get list of all PVCs on Specific Namespace") + dash.VerifyFatal(len(pvcs) == 100, true, fmt.Sprintf("did all PVC's created, length of PVCs created [%v]?", len(pvcs))) + + }) + + JustAfterEach(func() { + log.Infof("In Teardown") + defer EndTorpedoTest() + AfterEachTest(contexts) + }) + +}) + +var _ = Describe("{ExpandMultiplePoolsWhenFBDAVolumeCreationInProgress}", func() { + + /* + https://purestorage.atlassian.net/browse/PTX-24081 + Expand multiple pools in parallel , when lots of FBDA Volumes are being created + + */ + JustBeforeEach(func() { + log.Infof("Starting Torpedo tests ") + StartTorpedoTest("ExpandMultiplePoolsWhenFBDAVolumeCreationInProgress", + "Automate Scenario Create new pools when lots of Create / Delete FBDA Volumes are in progress", + nil, 0) + }) + + itLog := "ExpandMultiplePoolsWhenFBDAVolumeCreationInProgress" + It(itLog, func() { + + volDriverNamespace, err := Inst().V.GetVolumeDriverNamespace() + log.FailOnError(err, "failed to get volume driver [%s] namespace", Inst().V.String()) + pxPureSecret, err := pureutils.GetPXPureSecret(volDriverNamespace) + log.FailOnError(err, "failed to get secret [%s] in namespace [%s]", PureSecretName, volDriverNamespace) + listFB := pxPureSecret.Blades + + if len(listFB) == 0 { + log.FailOnError(fmt.Errorf("No FB Configurations is provided"), "is fb configured?") + } + + // Create Namespace on the cluster + nsuuid := uuid.New() + nsName := fmt.Sprintf("fbda-ns-%s", nsuuid.String()) + + log.Infof("Create Namespace with Name [%v]", nsName) + namespace, err := CreateNamespaces(nsName, 1) + log.FailOnError(err, "Failed to create Namespace") + + deleteNamespaces := func() { + log.Infof("Deleting Namespaces created during test [%v]", namespace) + err := DeleteNamespaces(namespace) + log.FailOnError(err, fmt.Sprintf("Failed to Delete namespaces [%v]", namespace)) + } + defer deleteNamespaces() + + // Create Storage Class + scName := fmt.Sprintf("fbda-sc-%s", nsuuid.String()) + log.Infof("Create Storage class with Name [%v]", scName) + + params := make(map[string]string) + params["pure_export_rules"] = "*(rw)" + + mountOptions := []string{"nfsvers=4.1", "tcp"} + var allowVolExpansion bool = true + err = CreateFlashStorageClass(scName, + "pure_file", + v1.PersistentVolumeReclaimDelete, + nil, mountOptions, &allowVolExpansion, + storageApi.VolumeBindingImmediate, + nil) + log.FailOnError(err, fmt.Sprintf("Failed to create storage class [%v] ", scName)) + + var wgfada sync.WaitGroup + wgfada.Add(1) + createFADAVolumes := func(wg *sync.WaitGroup) { + defer GinkgoRecover() + wg.Done() + for _, eachNs := range namespace { + // Create 100 PVCs on the Namespace + for i := 0; i < 100; i++ { + pvcName := fmt.Sprintf("fbda-pvc-%d-%s", i, nsuuid.String()) + log.FailOnError(CreateFlashPVCOnCluster(pvcName, scName, eachNs, "100"), + "Failed to create PVC on the cluster") + + log.FailOnError(Inst().S.WaitForSinglePVCToBound(pvcName, eachNs, 0), + "Errored occured while checking if PVC Bounded") + } + } + } + + // Expand Pools on all available Nodes while Volume Creation in Progress + poolIdsToExpand := []string{} + for _, eachNodes := range node.GetStorageNodes() { + pools, err := GetPoolsDetailsOnNode(&eachNodes) + // Get random Pool + randomIndex := rand.Intn(len(pools)) + pickPool := pools[randomIndex] + if err == nil { + poolIdsToExpand = append(poolIdsToExpand, pickPool.Uuid) + } else { + log.InfoD("Errored while getting Pool IDs , ignoring for now ...") + } + } + dash.VerifyFatal(len(poolIdsToExpand) > 0, true, + fmt.Sprintf("No pools with IO present ?")) + + go createFADAVolumes(&wgfada) + + expandType := []api.SdkStoragePool_ResizeOperationType{api.SdkStoragePool_RESIZE_TYPE_ADD_DISK} + if !IsPoolAddDiskSupported() { + expandType = []api.SdkStoragePool_ResizeOperationType{api.SdkStoragePool_RESIZE_TYPE_RESIZE_DISK} + } + wg, err := ExpandMultiplePoolsInParallel(poolIdsToExpand, 100, expandType) + dash.VerifyFatal(err, nil, "Pool expansion in parallel failed") + + wg.Wait() + wgfada.Wait() + + }) + + JustAfterEach(func() { + log.Infof("In Teardown") + defer EndTorpedoTest() + AfterEachTest(contexts) + }) + +}) + +var _ = Describe("{CreateNewPoolsWhenFadaFbdaVolumeCreationInProgress}", func() { + + /* + https://purestorage.atlassian.net/browse/PTX-23974 + Expand multiple pools in parallel , when lots of FADA and FBDA Volumes are being created + + */ + JustBeforeEach(func() { + log.Infof("Starting Torpedo tests ") + StartTorpedoTest("CreateNewPoolsWhenFadaFbdaVolumeCreationInProgress", + "Automate Scenario Create new pools when new Pools when lots of FADA / FBDA Volumes are getting Created", + nil, 0) + }) + + itLog := "CreateNewPoolsWhenFadaFbdaVolumeCreationInProgress" + It(itLog, func() { + + volDriverNamespace, err := Inst().V.GetVolumeDriverNamespace() + log.FailOnError(err, "failed to get volume driver [%s] namespace", Inst().V.String()) + pxPureSecret, err := pureutils.GetPXPureSecret(volDriverNamespace) + log.FailOnError(err, "failed to get secret [%s] in namespace [%s]", PureSecretName, volDriverNamespace) + listFB := pxPureSecret.Blades + + // Create Namespace on the cluster + nsuuid := uuid.New() + nsName := fmt.Sprintf("fbda-ns-%s", nsuuid.String()) + + log.Infof("Create Namespace with Name [%v]", nsName) + namespace, err := CreateNamespaces(nsName, 1) + log.FailOnError(err, "Failed to create Namespace") + + deleteNamespaces := func() { + log.Infof("Deleting Namespaces created during test [%v]", namespace) + err := DeleteNamespaces(namespace) + log.FailOnError(err, fmt.Sprintf("Failed to Delete namespaces [%v]", namespace)) + } + defer deleteNamespaces() + + var nodesToUse []node.Node + for _, each := range node.GetStorageNodes() { + sPools, err := GetPoolsDetailsOnNode(&each) + if err != nil { + fmt.Printf("[%v]", err) + } + if len(sPools) < 8 { + nodesToUse = append(nodesToUse, each) + } + } + + // Create Storage Class for FA + scNameFA := fmt.Sprintf("fada-sc-%s", nsuuid.String()) + log.Infof("Create Storage class with Name [%v]", scNameFA) + var allowVolExpansionFA bool = true + err = CreateFlashStorageClass(scNameFA, + "pure_block", + v1.PersistentVolumeReclaimDelete, + nil, nil, &allowVolExpansionFA, + storageApi.VolumeBindingImmediate, + nil) + log.FailOnError(err, fmt.Sprintf("Failed to create storage class [%v] ", scNameFA)) + + if len(listFB) > 1 { + // Create Storage Class FB + scNameFB := fmt.Sprintf("fbda-sc-%s", nsuuid.String()) + log.Infof("Create Storage class with Name [%v]", scNameFB) + + params := make(map[string]string) + params["pure_export_rules"] = "*(rw)" + + mountOptions := []string{"nfsvers=4.1", "tcp"} + var allowVolExpansion bool = true + err = CreateFlashStorageClass(scNameFB, + "pure_file", + v1.PersistentVolumeReclaimDelete, + nil, mountOptions, &allowVolExpansion, + storageApi.VolumeBindingImmediate, + nil) + log.FailOnError(err, fmt.Sprintf("Failed to create storage class [%v] ", scNameFB)) + } + + // Create Continuous FADA Volumes on the cluster + var wgfada sync.WaitGroup + wgfada.Add(1) + createFADAVolumes := func(wg *sync.WaitGroup) { + defer GinkgoRecover() + wg.Done() + for _, eachNs := range namespace { + // Create 100 PVCs on the Namespace + for i := 0; i < 100; i++ { + pvcName := fmt.Sprintf("fada-pvc-%d-%s", i, nsuuid.String()) + log.FailOnError(CreateFlashPVCOnCluster(pvcName, scNameFA, eachNs, "100"), + "Failed to create PVC on the cluster") + + log.FailOnError(Inst().S.WaitForSinglePVCToBound(pvcName, eachNs, 0), + "Errored occured while checking if PVC Bounded") + } + } + } + + var wgfbda sync.WaitGroup + createFBDAVolumes := func(wg *sync.WaitGroup) { + defer GinkgoRecover() + wg.Done() + for _, eachNs := range namespace { + // Create 100 PVCs on the Namespace + for i := 0; i < 100; i++ { + pvcName := fmt.Sprintf("fbda-pvc-%d-%s", i, nsuuid.String()) + log.FailOnError(CreateFlashPVCOnCluster(pvcName, scNameFA, eachNs, "100"), + "Failed to create PVC on the cluster") + log.FailOnError(Inst().S.WaitForSinglePVCToBound(pvcName, eachNs, 0), + "Errored occured while checking if PVC Bounded") + } + } + } + + go createFADAVolumes(&wgfada) + if len(listFB) > 1 { + // Create Continuous FADA Volumes on the cluster + wgfbda.Add(1) + go createFBDAVolumes(&wgfbda) + } + + log.Infof("Create new pools on multiple Nodes in Parallel") + log.FailOnError(CreateNewPoolsOnMultipleNodesInParallel(nodesToUse), "Failed to Create New Pools") + wgfada.Wait() + if len(listFB) > 1 { + wgfbda.Wait() + } + + }) + + JustAfterEach(func() { + log.Infof("In Teardown") + defer EndTorpedoTest() + AfterEachTest(contexts) + }) + +}) + +var _ = Describe("{CreateCloneOfTheFADAVolume}", func() { + /* + https://purestorage.atlassian.net/browse/PTX-24002 + 1.Deploy a FADA app + 2.Take the corresponding pxctl volume of the pvc and try to clone it + 3.Check the corresponding volume clone is available in FA backend + 4.Delete the FADA app + + */ + var contexts []*scheduler.Context + JustBeforeEach(func() { + StartTorpedoTest("CreateCloneOfTheFADAVolume", "Create Clone of the FADA Volume and verify the status", nil, 0) + }) + itLog := "Create Clone of the FADA Volume and verify the status and check creation of cloned volume in FA backend" + It(itLog, func() { + log.InfoD(itLog) + var volumeName string + var cloneVolumeId string + flashArrays, err := GetFADetailsUsed() + log.FailOnError(err, "Failed to get FA details used") + stepLog := "Deploy FADA app" + Step(stepLog, func() { + log.InfoD(stepLog) + taskName := "deploy-fada" + context, err := Inst().S.Schedule(taskName, scheduler.ScheduleOptions{ + AppKeys: []string{"fio-fa-davol"}, + StorageProvisioner: fmt.Sprintf("%v", portworx.PortworxCsi), + Namespace: taskName, + }) + log.FailOnError(err, "Failed to schedule application of namespace [%v]", taskName) + contexts = append(contexts, context...) + }) + ValidateApplications(contexts) + + stepLog = "Get the corresponding Px volume for the PVC and clone the volume " + Step(stepLog, func() { + log.InfoD(stepLog) + for _, context := range contexts { + appsvols, err := Inst().S.GetVolumes(context) + log.FailOnError(err, "Failed to get volumes for app %s", context.App.Key) + log.InfoD("Starting the Clone of the Volume") + for _, vol := range appsvols[:1] { + cloneVolumeId, err := Inst().V.CloneVolume(vol.ID) + log.FailOnError(err, "Failed to clone volume [%v]", vol.ID) + log.InfoD("Clone Volume ID [%v] for parent volume [%v]", cloneVolumeId, vol.ID) + } + } + log.InfoD("Get the corresponding volume name for the volId") + for _, context := range contexts { + appsvols, err := Inst().S.GetVolumes(context) + log.FailOnError(err, "Failed to get volumes for app %s", context.App.Key) + for _, vol := range appsvols { + if vol.ID == cloneVolumeId { + if vol.Name != "" { + volumeName = vol.Name + log.InfoD("Volume Name for the Clone Volume is [%v]", volumeName) + } + break + + } + } + } + }) + checkVolumeExistsInFlashArrays := func(volumeName string, flashArrays []pureutils.FlashArrayEntry) error { + cloneVolFound := false + + for _, fa := range flashArrays { + faClient, err := pureutils.PureCreateClientAndConnect(fa.MgmtEndPoint, fa.APIToken) + log.FailOnError(err, fmt.Sprintf("Failed to connect to FA using Mgmt IP [%v]", fa.MgmtEndPoint)) + volName, err := GetVolumeCompleteNameOnFA(faClient, volumeName) + log.FailOnError(err, fmt.Sprintf("Failed to get volume name for volume [%v]", volumeName)) + log.Infof("Name of the Volume is [%v]", volName) + + isExists, err := pureutils.IsFAVolumeExists(faClient, volName) + log.FailOnError(err, fmt.Sprintf("Failed to check if volume exists on FA: %v", err)) + + if isExists { + log.InfoD("Volume [%v] exists on the FA Cluster [%v]", volName, fa.MgmtEndPoint) + return nil + } + log.Infof("Volume [%v] doesn't exist on the FA Cluster [%v]", volName, fa.MgmtEndPoint) + + } + if !cloneVolFound { + return fmt.Errorf("volume %s does not exist in any of the FlashArrays", volumeName) + } + return nil + } + stepLog = "Check the corresponding volume clone is available in FA backend" + Step(stepLog, func() { + log.InfoD(stepLog) + err := checkVolumeExistsInFlashArrays(volumeName, flashArrays) + log.FailOnError(err, "Failed to check if volume exists in FA backend") + }) + + }) + JustAfterEach(func() { + defer EndTorpedoTest() + appsValidateAndDestroy(contexts) + }) +}) diff --git a/tests/basic/px_cluster_migration_test.go b/tests/basic/px_cluster_migration_test.go index 2f3fe4eb1..b667bbc9b 100644 --- a/tests/basic/px_cluster_migration_test.go +++ b/tests/basic/px_cluster_migration_test.go @@ -54,6 +54,25 @@ func waitForIKSMasterUpdate(schedVersion string) error { } +func waitForIBMNodeToDelete(nodeToKill node.Node) error { + t := func() (interface{}, bool, error) { + + currState, err := Inst().N.GetNodeState(nodeToKill) + if err != nil { + return "", true, err + } + if currState == ibm.DELETED { + return "", false, nil + } + + return "", true, fmt.Errorf("node [%s] not deleted yet, current state : %s", nodeToKill.Hostname, currState) + + } + + _, err := task.DoRetryWithTimeout(t, 10*time.Minute, 1*time.Minute) + return err +} + func upgradeIKSWorkerNodes(schedVersion, poolName string) error { storageDriverNodes := node.GetStorageDriverNodes() diff --git a/tests/basic/sharedv4_multivol_test.go b/tests/basic/sharedv4_multivol_test.go index bbd42adc1..86789a7da 100644 --- a/tests/basic/sharedv4_multivol_test.go +++ b/tests/basic/sharedv4_multivol_test.go @@ -32,40 +32,12 @@ var _ = Describe("{MultiVolumeMountsForSharedV4}", func() { stepLog := "has to create multiple sharedv4 volumes and mount to single pod" It(stepLog, func() { log.InfoD(stepLog) - // set frequency mins depending on the chaos level - var frequency int - var timeout time.Duration - - chaosLevel := Inst().ChaosLevel - if chaosLevel != 0 { - frequency = 10 * chaosLevel - timeout = (15 * time.Duration(chaosLevel) * time.Minute) / 10 - } else { - frequency = 10 - timeout = 1 * time.Minute - } - log.InfoD("setting number of volumes=%v and app readiness timeout=%v for chaos level %v", - frequency, timeout, chaosLevel) - - customAppConfig := scheduler.AppConfig{ - ClaimsCount: frequency, - } - - provider := Inst().V.String() - contexts = []*scheduler.Context{} - // there should be only 1 app - Expect(len(Inst().AppList)).To(Equal(1)) - appName := Inst().AppList[0] - - Inst().CustomAppConfig[appName] = customAppConfig - err := Inst().S.RescanSpecs(Inst().SpecDir, provider) - log.FailOnError(err, "Failed to rescan specs from %s for storage provider %s", Inst().SpecDir, provider) stepLog = "schedule application with multiple sharedv4 volumes attached" + timeout := 5 * time.Minute Step(stepLog, func() { log.InfoD(stepLog) - log.InfoD("Number of Volumes to be mounted: %v", frequency) taskName := "sharedv4-multivol" @@ -77,6 +49,10 @@ var _ = Describe("{MultiVolumeMountsForSharedV4}", func() { } for _, ctx := range contexts { + pvcs, err := k8sCore.GetPersistentVolumeClaims(ctx.App.NameSpace, nil) + log.FailOnError(err, "Failed to get PVCs for app %s", ctx.App.Key) + timeout = (15 * time.Duration(len(pvcs.Items)) * time.Minute) / 10 + log.InfoD("Number of Volumes to be mounted: %v", len(pvcs.Items)) ctx.ReadinessTimeout = timeout ctx.SkipVolumeValidation = false ValidateContext(ctx) diff --git a/tests/basic/sharedv4_svc_test.go b/tests/basic/sharedv4_svc_test.go index 9dcbbab37..003915b73 100644 --- a/tests/basic/sharedv4_svc_test.go +++ b/tests/basic/sharedv4_svc_test.go @@ -2,7 +2,6 @@ package tests import ( "fmt" - "gopkg.in/yaml.v2" "os" "path" "path/filepath" @@ -11,6 +10,8 @@ import ( "sync" "time" + "gopkg.in/yaml.v2" + "github.com/portworx/torpedo/pkg/log" "github.com/portworx/torpedo/pkg/testrailuttils" @@ -1830,7 +1831,7 @@ func waitForNumPodsToEqual(ctx *scheduler.Context, numPods int) { func getSv4TestAppVol(ctx *scheduler.Context) (*volume.Volume, *api.Volume, *node.Node) { vols, err := Inst().S.GetVolumes(ctx) Expect(err).NotTo(HaveOccurred()) - Expect(len(vols)).To(Equal(1)) + Expect(len(vols)).To(Not(BeZero())) vol := vols[0] apiVol, err := Inst().V.InspectVolume(vol.ID) diff --git a/tests/basic/storage_pool_test.go b/tests/basic/storage_pool_test.go index 6d6334a83..bbd2f1a97 100644 --- a/tests/basic/storage_pool_test.go +++ b/tests/basic/storage_pool_test.go @@ -8,6 +8,10 @@ import ( "regexp" "slices" "sort" + "strconv" + "strings" + "sync" + "time" "github.com/Masterminds/semver/v3" "github.com/portworx/torpedo/drivers/node/ssh" @@ -20,18 +24,15 @@ import ( "github.com/portworx/torpedo/pkg/log" - "strconv" - "strings" - "sync" - "time" - "github.com/libopenstorage/openstorage/api" . "github.com/onsi/ginkgo/v2" + "github.com/portworx/sched-ops/k8s/core" "github.com/portworx/sched-ops/task" "github.com/portworx/torpedo/drivers/scheduler" "github.com/portworx/torpedo/pkg/testrailuttils" "github.com/portworx/torpedo/pkg/units" . "github.com/portworx/torpedo/tests" + corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -85,6 +86,9 @@ var _ = Describe("{StoragePoolExpandDiskAdd}", func() { stepLog := "should get the existing pool and expand it by adding a disk" It(stepLog, func() { log.InfoD(stepLog) + if !IsPoolAddDiskSupported() { + Skip("Pool Add Disk is not supported on DMthin Cluster") + } contexts = make([]*scheduler.Context, 0) for i := 0; i < Inst().GlobalScaleFactor; i++ { @@ -125,7 +129,7 @@ var _ = Describe("{StoragePoolExpandDiskAdd}", func() { stepLog = "Calculate expected pool size and trigger pool resize" Step(stepLog, func() { log.InfoD(stepLog) - expectedSize = poolToBeResized.TotalSize * 2 / units.GiB + expectedSize = (poolToBeResized.TotalSize / units.GiB) + 100 expectedSize = roundUpValue(expectedSize) isjournal, err := IsJournalEnabled() log.FailOnError(err, "Failed to check is Journal enabled") @@ -140,33 +144,28 @@ var _ = Describe("{StoragePoolExpandDiskAdd}", func() { enterPoolMaintenanceAddDisk(poolIDToResize) defer exitPoolMaintenance(poolIDToResize) - err = Inst().V.ExpandPool(poolIDToResize, api.SdkStoragePool_RESIZE_TYPE_ADD_DISK, expectedSize, false) - if err != nil { - isPoolAddDiskSupported := IsPoolAddDiskSupported() - if !isPoolAddDiskSupported { - IsExpectederr := strings.Contains(err.Error(), "add-drive type expansion is not supported with px-storev2. Use resize-drive expansion type") - dash.VerifyFatal(IsExpectederr, true, err.Error()) - log.InfoD("Drive add not supported :%s, hence skipping the test", err.Error()) - Skip("drive add to existing pool not supported for px-storev2 or px-cache pools") - - } + if IsPoolAddDiskSupported() { + err = Inst().V.ExpandPool(poolIDToResize, api.SdkStoragePool_RESIZE_TYPE_ADD_DISK, expectedSize, false) + log.FailOnError(err, "is Pool Expand using Add disk successful ?") + resizeErr := waitForPoolToBeResized(expectedSize, poolIDToResize, isjournal) + dash.VerifyFatal(resizeErr, nil, fmt.Sprintf("Expected new size to be '%d' or '%d' if pool has journal", expectedSize, expectedSizeWithJournal)) } - dash.VerifyFatal(err, nil, "Pool expansion init successful?") - resizeErr := waitForPoolToBeResized(expectedSize, poolIDToResize, isjournal) - dash.VerifyFatal(resizeErr, nil, fmt.Sprintf("Expected new size to be '%d' or '%d' if pool has journal", expectedSize, expectedSizeWithJournal)) }) Step("Ensure that new pool has been expanded to the expected size", func() { - ValidateApplications(contexts) - resizedPool, err := GetStoragePoolByUUID(poolIDToResize) - log.FailOnError(err, fmt.Sprintf("Failed to get pool using UUID %s", poolIDToResize)) - newPoolSize := resizedPool.TotalSize / units.GiB - isExpansionSuccess := false - if newPoolSize >= expectedSizeWithJournal { - isExpansionSuccess = true + if IsPoolAddDiskSupported() { + ValidateApplications(contexts) + resizedPool, err := GetStoragePoolByUUID(poolIDToResize) + log.FailOnError(err, fmt.Sprintf("Failed to get pool using UUID %s", poolIDToResize)) + newPoolSize := resizedPool.TotalSize / units.GiB + isExpansionSuccess := false + if newPoolSize >= expectedSizeWithJournal { + isExpansionSuccess = true + } + dash.VerifyFatal(isExpansionSuccess, true, + fmt.Sprintf("expected new pool size to be %v or %v if pool has journal, got %v", expectedSize, expectedSizeWithJournal, newPoolSize)) + appsValidateAndDestroy(contexts) } - dash.VerifyFatal(isExpansionSuccess, true, - fmt.Sprintf("expected new pool size to be %v or %v if pool has journal, got %v", expectedSize, expectedSizeWithJournal, newPoolSize)) - appsValidateAndDestroy(contexts) + }) }) JustAfterEach(func() { @@ -1197,7 +1196,7 @@ var _ = Describe("{AddDriveWithPXRestart}", func() { } finalPoolCount = len(pools) dash.VerifyFatal(newTotalPoolSize, expectedTotalPoolSize, fmt.Sprintf("Validate total pool size after add cloud drive on node %s", stNode.Name)) - dash.VerifyFatal(initialPoolCount+1 == finalPoolCount, true, fmt.Sprintf("Total pool count after cloud drive add with PX restart Expected:[%d] Got:[%d]", initialPoolCount, finalPoolCount)) + dash.VerifyFatal(initialPoolCount+1 == finalPoolCount, true, fmt.Sprintf("Total pool count after cloud drive add with PX restart Expected:[%d] Got:[%d]", initialPoolCount+1, finalPoolCount)) }) }) @@ -2081,7 +2080,7 @@ var _ = Describe("{AddWithPXRestart}", func() { It(stepLog, func() { isPoolAddDiskSupported := IsPoolAddDiskSupported() if !isPoolAddDiskSupported { - dash.VerifyFatal(false, true, "Add disk operation is not supported for DMThin Setup") + Skip("Add disk operation is not supported for DMThin Setup") } log.InfoD(stepLog) contexts = make([]*scheduler.Context, 0) @@ -3681,7 +3680,7 @@ var _ = Describe("{PoolMaintenanceModeAddDisk}", func() { It(stepLog, func() { isPoolAddDiskSupported := IsPoolAddDiskSupported() if !isPoolAddDiskSupported { - dash.VerifyFatal(false, true, "Add disk operation is not supported for DMThin Setup") + Skip("Pool Add disk is not supported on DMThin Cluster") } log.InfoD(stepLog) @@ -3759,28 +3758,18 @@ var _ = Describe("{PoolMaintenanceModeAddDisk}", func() { isjournal, err := IsJournalEnabled() log.FailOnError(err, "Failed to check if Journal enabled") - log.InfoD("Current Size of the pool %s is %d", poolToBeResized.Uuid, poolToBeResized.TotalSize/units.GiB) - err = Inst().V.ExpandPool(poolToBeResized.Uuid, api.SdkStoragePool_RESIZE_TYPE_ADD_DISK, expectedSize, true) - if err != nil { - isPoolAddDiskSupported := IsPoolAddDiskSupported() - if !isPoolAddDiskSupported { - IsExpectederr := strings.Contains(err.Error(), "add-drive type expansion is not supported with px-storev2. Use resize-drive expansion type") - dash.VerifyFatal(IsExpectederr, true, err.Error()) - log.InfoD("Drive add not supported :%s, hence skipping the test", err.Error()) - Skip("drive add to existing pool not supported for px-storev2 or px-cache pools") - - } - + if IsPoolAddDiskSupported() { + log.InfoD("Current Size of the pool %s is %d", poolToBeResized.Uuid, poolToBeResized.TotalSize/units.GiB) + err = Inst().V.ExpandPool(poolToBeResized.Uuid, api.SdkStoragePool_RESIZE_TYPE_ADD_DISK, expectedSize, true) + log.FailOnError(err, "Pool Expand using Add Disk Failed ") + resizeErr := waitForPoolToBeResized(expectedSize, poolToBeResized.Uuid, isjournal) + dash.VerifyFatal(resizeErr, nil, fmt.Sprintf("Verify pool %s on node %s expansion using add-disk", poolToBeResized.Uuid, stNode.Name)) } - dash.VerifyFatal(err, nil, "Pool expansion init successful?") - resizeErr := waitForPoolToBeResized(expectedSize, poolToBeResized.Uuid, isjournal) - dash.VerifyFatal(resizeErr, nil, fmt.Sprintf("Verify pool %s on node %s expansion using add-disk", poolToBeResized.Uuid, stNode.Name)) - + status, err = Inst().V.GetNodeStatus(*stNode) + log.FailOnError(err, "err getting node [%s] status", stNode.Name) + log.Infof(fmt.Sprintf("Node %s status %s after exit", stNode.Name, status.String())) }) - status, err = Inst().V.GetNodeStatus(*stNode) - log.FailOnError(err, "err getting node [%s] status", stNode.Name) - log.Infof(fmt.Sprintf("Node %s status %s after exit", stNode.Name, status.String())) }) JustAfterEach(func() { @@ -4338,7 +4327,7 @@ var _ = Describe("{PXRestartAddDisk}", func() { It(stepLog, func() { isPoolAddDiskSupported := IsPoolAddDiskSupported() if !isPoolAddDiskSupported { - dash.VerifyFatal(false, true, "Add disk operation is not supported for DMThin Setup") + Skip("Add disk operation is not supported for DMThin Setup") } log.InfoD(stepLog) contexts = make([]*scheduler.Context, 0) @@ -5054,7 +5043,7 @@ var _ = Describe("{ResizeKvdbNoQuorum}", func() { ValidateApplications(contexts) defer appsValidateAndDestroy(contexts) - stoageDriverNodes := node.GetStorageDriverNodes() + stoageDriverNodes := node.GetStorageNodes() nonKvdbNodes := make([]node.Node, 0) kvdbNodes := make([]node.Node, 0) @@ -5076,6 +5065,10 @@ var _ = Describe("{ResizeKvdbNoQuorum}", func() { } } + if len(nonKvdbNodes) == 0 { + log.FailOnError(fmt.Errorf("No non kvdb nodes found"), "non kvdb nodes doesnt not exist in the cluster") + } + selPool := nonKvdbNodes[0].Pools[0] poolToBeResized, err := GetStoragePoolByUUID(selPool.Uuid) log.FailOnError(err, fmt.Sprintf("Failed to get pool using UUID %s", selPool.Uuid)) @@ -6338,7 +6331,7 @@ var _ = Describe("{ChangedIOPriorityPersistPoolExpand}", func() { contexts = make([]*scheduler.Context, 0) for i := 0; i < Inst().GlobalScaleFactor; i++ { - contexts = append(contexts, ScheduleApplications(fmt.Sprintf("changedioprioritypoolexpand-%d", i))...) + contexts = append(contexts, ScheduleApplications(fmt.Sprintf("chgpriopoolex-%d", i))...) } ValidateApplications(contexts) defer appsValidateAndDestroy(contexts) @@ -7126,6 +7119,10 @@ var _ = Describe("{ExpandUsingAddDriveAndPXRestart}", func() { It(stepLog, func() { log.InfoD(stepLog) + if !IsPoolAddDiskSupported() { + Skip("Add disk is not supported in DMThin") + } + contexts = make([]*scheduler.Context, 0) for i := 0; i < Inst().GlobalScaleFactor; i++ { contexts = append(contexts, ScheduleApplications(fmt.Sprintf("pladddrvrestrt-%d", i))...) @@ -7192,6 +7189,10 @@ var _ = Describe("{ExpandUsingAddDriveAndNodeRestart}", func() { It(stepLog, func() { log.InfoD(stepLog) + if !IsPoolAddDiskSupported() { + Skip("Add disk is not supported on DMThin Cluster") + } + contexts = make([]*scheduler.Context, 0) for i := 0; i < Inst().GlobalScaleFactor; i++ { contexts = append(contexts, ScheduleApplications(fmt.Sprintf("expanddiskadddrive-%d", i))...) @@ -7274,7 +7275,7 @@ var _ = Describe("{ResizeDiskAddDiskSamePool}", func() { It(stepLog, func() { isPoolAddDiskSupported := IsPoolAddDiskSupported() if !isPoolAddDiskSupported { - dash.VerifyFatal(false, true, "Add disk operation is not supported for DMThin Setup") + Skip("Add disk operation is not supported for DMThin Setup") } log.InfoD(stepLog) contexts = make([]*scheduler.Context, 0) @@ -7327,24 +7328,26 @@ var _ = Describe("{ResizeDiskAddDiskSamePool}", func() { dash.VerifyFatal(resizeErr, nil, fmt.Sprintf("Verify pool [%s] on expansion using auto option", poolToBeResized.Uuid)) - expectedSize += drvSize + if IsPoolAddDiskSupported() { + expectedSize += drvSize - // Expand Pool using Add Drive and verify if the Pool is expanded successfully - err = Inst().V.ExpandPool(poolToBeResized.Uuid, - api.SdkStoragePool_RESIZE_TYPE_ADD_DISK, - expectedSize, true) - dash.VerifyFatal(err, - nil, - "Pool expansion init successful?") + // Expand Pool using Add Drive and verify if the Pool is expanded successfully + err = Inst().V.ExpandPool(poolToBeResized.Uuid, + api.SdkStoragePool_RESIZE_TYPE_ADD_DISK, + expectedSize, true) + dash.VerifyFatal(err, + nil, + "Pool expansion init successful?") - resizeErr = waitForPoolToBeResized(expectedSize, poolUUID, isjournal) - dash.VerifyFatal(resizeErr, nil, - fmt.Sprintf("Verify pool [%s] on expansion using auto option", poolUUID)) + resizeErr = waitForPoolToBeResized(expectedSize, poolUUID, isjournal) + dash.VerifyFatal(resizeErr, nil, + fmt.Sprintf("Verify pool [%s] on expansion using auto option", poolUUID)) - allPoolsOnNodeAfterResize, err := GetPoolsDetailsOnNode(nodeDetail) - log.FailOnError(err, fmt.Sprintf("Failed to get all Pools present in Node [%s]", nodeDetail.Name)) - dash.VerifyFatal(len(allPoolsOnNode) <= len(allPoolsOnNodeAfterResize), true, - "New pool is created on trying to expand pool using add disk option") + allPoolsOnNodeAfterResize, err := GetPoolsDetailsOnNode(nodeDetail) + log.FailOnError(err, fmt.Sprintf("Failed to get all Pools present in Node [%s]", nodeDetail.Name)) + dash.VerifyFatal(len(allPoolsOnNode) <= len(allPoolsOnNodeAfterResize), true, + "New pool is created on trying to expand pool using add disk option") + } }) JustAfterEach(func() { @@ -7648,6 +7651,20 @@ var _ = Describe("{AllPoolsDeleteAndCreateAndDelete}", func() { }) func deletePoolAndValidate(stNode node.Node, poolIDToDelete string) { + isPureBackend := false + validateMultipath := []string{} + if IsPureCluster() { + isPureBackend = true + } + + if isPureBackend { + // if pure backend , we get the list of all multipath devices used while creating the pool + // later check if those multipath devices are still exist post deleting the pool + multipathDevBeforeDelete, err := GetMultipathDeviceOnPool(&stNode) + log.FailOnError(err, fmt.Sprintf("Failed to get list of Multipath devices on Node [%v]", stNode.Name)) + validateMultipath = multipathDevBeforeDelete[poolIDToDelete] + } + poolsBfr, err := Inst().V.ListStoragePools(metav1.LabelSelector{}) log.FailOnError(err, "Failed to list storage pools") @@ -7671,6 +7688,16 @@ func deletePoolAndValidate(stNode node.Node, poolIDToDelete string) { _, ok := poolsMap[poolIDToDelete] dash.VerifyFatal(ok, false, "verify drive is deleted from the node") + if isPureBackend { + // Get list of all Multipath devices after deleting the pool + allMultipathDev, err := GetMultipathDeviceIDsOnNode(&stNode) + log.FailOnError(err, fmt.Sprintf("failed to get multipath devices on Node [%v]", stNode.Name)) + for _, eachMultipath := range allMultipathDev { + for _, validateEach := range validateMultipath { + dash.VerifyFatal(validateEach == eachMultipath, false, fmt.Sprintf("Multipath device [%v] did not delete on Deleting Pool", validateEach)) + } + } + } }) } @@ -8720,7 +8747,7 @@ var _ = Describe("{DriveAddAsJournal}", func() { } log.InfoD("adding journal failed as expected. verifying the error") re := regexp.MustCompile(".*journal exists*") - re1 := regexp.MustCompile(".*Journal device.*is alredy configured*") + re1 := regexp.MustCompile(".*Journal device.*is already configured*") dash.VerifyFatal(re.MatchString(fmt.Sprintf("%v", err)) || re1.MatchString(fmt.Sprintf("%v", err)), true, fmt.Sprintf("Errored while adding Pool as expected on Node [%v]", nodeDetail.Name)) @@ -9320,6 +9347,9 @@ var _ = Describe("{ExpandMultiplePoolWithIOsInClusterAtOnce}", func() { fmt.Sprintf("No pools with IO present ?")) expandType := []api.SdkStoragePool_ResizeOperationType{api.SdkStoragePool_RESIZE_TYPE_ADD_DISK} + if !IsPoolAddDiskSupported() { + expandType = []api.SdkStoragePool_ResizeOperationType{api.SdkStoragePool_RESIZE_TYPE_RESIZE_DISK} + } wg, err := ExpandMultiplePoolsInParallel(poolIdsToExpand, 100, expandType) dash.VerifyFatal(err, nil, "Pool expansion in parallel failed") @@ -9835,7 +9865,13 @@ func scheduleApps() []*scheduler.Context { func pickPoolToResize(excludeNodeIDs ...string) string { poolWithIO, err := GetPoolIDWithIOs(contexts) - if poolWithIO == "" || err != nil { + + if err != nil { + log.Warnf("Error identifying pool with IOs, Errot: %v", err) + } + if poolWithIO != "" { + return poolWithIO + } else { log.Warnf("No pool with IO found, picking a random pool in use to resize") } poolIDsInUseByTestingApp, err := GetPoolsInUse() @@ -9890,8 +9926,15 @@ func triggerPoolExpansion(poolIDToResize string, targetSizeGiB uint64, expandTyp stepLog := "Trigger pool expansion" Step(stepLog, func() { log.InfoD(stepLog) + isDMthin, _ := IsDMthin() err := Inst().V.ExpandPool(poolIDToResize, expandType, targetSizeGiB, true) - dash.VerifyFatal(err, nil, "pool expansion requested successfully") + if isDMthin && expandType == api.SdkStoragePool_RESIZE_TYPE_ADD_DISK { + dash.VerifyFatal(err != nil, true, + "Pool expansion request of add-disk type should be rejected with dmthin") + dash.VerifyFatal(strings.Contains(err.Error(), "add-drive type expansion is not supported with px-storev2"), true, fmt.Sprintf("check error message: %v", err.Error())) + } else { + dash.VerifyFatal(err, nil, "pool expansion requested successfully") + } }) } func waitForOngoingPoolExpansionToComplete(poolIDToResize string) error { @@ -12080,3 +12123,387 @@ var _ = Describe("{PoolDeleteMultiplePools}", func() { }) }) + +var _ = Describe("{VolResizeAllVolumes}", func() { + + /* + PTX-23576 + Trigger vol resize on all volumes at once + */ + + JustBeforeEach(func() { + StartTorpedoTest("VolResizeAllVolumes", "Trigger vol resize on all volumes at once", nil, 0) + }) + + itLog := "VolResizeAllVolumes" + It(itLog, func() { + var contexts []*scheduler.Context + var k8sCore = core.Instance() + + type VolumeDetails struct { + vol *volume.Volume + pvc *corev1.PersistentVolumeClaim + ctx *scheduler.Context + } + volSizeMap := []*VolumeDetails{} + + stepLog = "Enable Trashcan on the cluster" + Step(stepLog, + func() { + log.InfoD(stepLog) + err := EnableTrashcanOnCluster("90") + log.FailOnError(err, "failed to enable trashcan on the cluster") + }) + + stepLog = "Schedule Applications on the cluster and get details of Volumes" + Step(stepLog, func() { + for i := 0; i < Inst().GlobalScaleFactor; i++ { + contexts = append(contexts, ScheduleApplications(fmt.Sprintf("volresizeallvol-%d", i))...) + } + }) + appsDeleted := false + deleteApps := func() { + if !appsDeleted { + appsValidateAndDestroy(contexts) + } + } + + ValidateApplications(contexts) + defer deleteApps() + + stepLog = "Verify parallel resize of all the volumes " + Step(stepLog, func() { + for _, eachCtx := range contexts { + vols, err := Inst().S.GetVolumes(eachCtx) + log.FailOnError(err, "Failed to get list of Volumes in the cluster") + for _, eachVol := range vols { + volDetails := VolumeDetails{} + + // Get details on the Volume + volDetails.vol = eachVol + + // Get PVC object from the Volume + pvc, err := GetPVCObjFromVol(eachVol) + log.FailOnError(err, "Failed to get PVC Details from Volume [%v]", eachVol.Name) + + // Update volSizeMap to perform Parallel Resize of all the Volumes present in the cluster + volDetails.pvc = pvc + volSizeMap = append(volSizeMap, &volDetails) + } + } + }) + + for _, eachVol := range volSizeMap { + // Pod details after blocking IP + podsAfterblk, err := k8sCore.GetPodsUsingPVC(eachVol.vol.Name, eachVol.vol.Namespace) + log.FailOnError(err, "unable to find the node from the pod") + for _, eachPodAfter := range podsAfterblk { + log.Infof(fmt.Sprintf("Current state of the Pod [%v] is [%v]", eachPodAfter.Name, eachPodAfter.Status.Phase)) + if eachPodAfter.Status.Phase != "Running" { + log.Infof(fmt.Sprintf("State of the Pod before Resize volume [%v] is [%v]", eachPodAfter.Name, eachPodAfter.Status.Phase)) + log.FailOnError(fmt.Errorf("Pod [%v] Consuming Volume [%v] is not in Running State ", + eachPodAfter.Name, eachVol.vol.Name), "Pod not in Running State") + } + } + } + + // Volume resize routine resizes specific Volume + log.InfoD("start Volume resize on each Volume present in the cluster") + ResizePvcInParallel := func(newVolumeIDs *VolumeDetails) { + defer GinkgoRecover() + volCurSize := newVolumeIDs.vol.Size / units.GiB + volNewSize := volCurSize + 10 + log.Infof("Resizing Volume [%v] from size [%v]/[%v] to [%v]/[%v]", + newVolumeIDs.vol.Name, newVolumeIDs.vol.Size, newVolumeIDs.vol.Size/units.GB, + volNewSize*units.GB, volNewSize) + + log.Infof("Resizing PVC [%v] to [%v]", newVolumeIDs.pvc.Name, volNewSize) + vol, err := Inst().S.ResizePVC(newVolumeIDs.ctx, newVolumeIDs.pvc, 10) + log.FailOnError(err, "Failed to resize PVC [%v]", vol.Name) + + time.Sleep(30 * time.Second) + volReSize, err := Inst().V.InspectVolume(vol.ID) + log.FailOnError(err, "inspect returned error ?") + + log.Infof("Verify volume size after resizing the volume [%v]", vol.Name) + dash.VerifyFatal(volReSize.Spec.Size > newVolumeIDs.vol.Size, true, + fmt.Sprintf("Resize of Volume didnot happen? current size is [%v]", volReSize.Spec.Size/units.GiB)) + + log.Infof(fmt.Sprintf("Volume [%v] resized from [%v] to [%v]", + newVolumeIDs.vol.Name, newVolumeIDs.vol.Size, volReSize.Spec.Size)) + dash.VerifyFatal((volReSize.Spec.Size/units.GiB) == volNewSize, true, + fmt.Sprintf("Resize of Volume didnot happen? current size is [%v]!", volReSize.Spec.Size/units.GiB)) + + } + + // Resize Volumes in parallel + ResizeVolumes := func(volId string) { + defer GinkgoRecover() + sizeBeforeResize, err := Inst().V.InspectVolume(volId) + log.FailOnError(err, "inspect returned error ?") + toResize := sizeBeforeResize.Spec.Size + (10 * units.GiB) + log.Infof("Resizing Volume [%v] from [%v] to [%v]", + volId, sizeBeforeResize.Spec.Size, toResize/units.GiB) + + // Resize Volume and verify if volume resized + log.FailOnError(Inst().V.ResizeVolume(volId, toResize), "Failed to resize volume") + + //Size after resize + sizeAfterResize, err := Inst().V.InspectVolume(volId) + log.FailOnError(err, "inspect returned error ?") + + dash.VerifyFatal(sizeBeforeResize.Spec.Size < sizeAfterResize.Spec.Size, true, + "Volume resize did not happen") + + log.Infof("Volume [%v] resized from [%v] to [%v] and expected is [%v]", + volId, sizeBeforeResize.Spec.Size, toResize, sizeAfterResize.Spec.Size) + + dash.VerifyFatal((toResize/units.GiB) == (sizeAfterResize.Spec.Size/units.GiB), true, + fmt.Sprintf("Resize of Volume didnot happen? current size is [%v]!", sizeAfterResize.Spec.Size)) + + } + + for _, eachVol := range volSizeMap { + Step(fmt.Sprintf("Do Resize on Volume [%v]", eachVol.vol.Name), func() { + go ResizePvcInParallel(eachVol) + }) + } + + // wait for some time before checking all the applications are Up and Running + time.Sleep(60 * time.Second) + + for _, eachVol := range volSizeMap { + // Pod details after blocking IP + podsAfterblk, err := k8sCore.GetPodsUsingPVC(eachVol.vol.Name, eachVol.vol.Namespace) + log.FailOnError(err, fmt.Sprintf("failed to get details of Pods assigned to volume [%v]", eachVol.vol.Name)) + for _, eachPodAfter := range podsAfterblk { + log.Infof(fmt.Sprintf("State of the pod after resize [%v] is [%v]", + eachPodAfter.Name, eachPodAfter.Status.Phase)) + if eachPodAfter.Status.Phase != "Running" { + log.FailOnError(fmt.Errorf("Pod [%v] Consuming Volume [%v] is not in Running State ", + eachPodAfter.Name, eachVol.vol.Name), "Pod not in Running State") + } + } + } + + // Destroy all apps + DestroyApps(contexts, nil) + appsDeleted = true + + // Restore all the Volumes from trashcan + var trashcanVols []string + stepLog = "validate volumes in trashcan" + Step(stepLog, func() { + // wait for few seconds for pvc to get deleted and volume to get detached + time.Sleep(60 * time.Second) + node := node.GetStorageDriverNodes()[0] + log.InfoD(stepLog) + trashcanVols, err = Inst().V.GetTrashCanVolumeIds(node) + log.FailOnError(err, "error While getting trashcan volumes") + log.Infof("trashcan len: %v", trashcanVols) + dash.VerifyFatal(len(trashcanVols) > 0, true, "validate volumes exist in trashcan") + + for _, volsInTrash := range trashcanVols { + if volsInTrash != "" { + volReSize, err := Inst().V.InspectVolume(volsInTrash) + log.FailOnError(err, "inspect returned error for volume [%v]?", volsInTrash) + if !volReSize.InTrashcan { + log.FailOnError(fmt.Errorf("Volume [%v] is still not in trashcan", volsInTrash), + "is volume in trashcan after delete ?") + } + } + } + }) + + log.Infof("list of volumes in trashcan [%v]", trashcanVols) + + // Get List of volumes present in the cluster before Restoring volumes + allVols, err := Inst().V.ListAllVolumes() + log.FailOnError(err, "failed to get list of volumes") + log.Infof("List of all Volumes present in the cluster [%v]", allVols) + + stepLog = "validate restore volumes from trashcan" + restoredVol := []string{} + newUUID, err := uuid.NewRandom() + log.FailOnError(err, "failed to get random UUID") + + Step(stepLog, func() { + // Restore Volumes from trashcan + for _, eachVol := range trashcanVols { + if eachVol != "" { + err = trashcanRestore(eachVol, fmt.Sprintf("restore_%v_%v", newUUID, eachVol)) + log.FailOnError(err, fmt.Sprintf("Failed restoring volume [%v] from trashcan", eachVol)) + restoredVol = append(restoredVol, fmt.Sprintf("restore_%v_%v", newUUID, eachVol)) + } + } + }) + + // Get List of volumes present in the cluster before Restoring volumes + allVolsAfterRestore, err := Inst().V.ListAllVolumes() + log.FailOnError(err, "failed to get list of volumes") + log.Infof("List of all Volumes present in the cluster after restore [%v]", allVolsAfterRestore) + + for _, eachVolume := range restoredVol { + volReSize, err := Inst().V.InspectVolume(eachVolume) + log.FailOnError(err, "inspect returned error for volume [%v]?", volReSize.Id) + if strings.Contains(eachVolume, fmt.Sprintf("restore_%v", newUUID)) { + log.Infof("Resizing Volume [%v]", eachVolume) + // Resize Volume in parallel + go ResizeVolumes(eachVolume) + } + } + + time.Sleep(60 * time.Second) + // Sleep for some time and try deleting Volumes which were restore from trashcan + for _, eachVolume := range restoredVol { + if strings.Contains(eachVolume, fmt.Sprintf("restore_%v", newUUID)) { + log.Infof("Deleting the volume [%v]", eachVolume) + // Delete Volumes which are restored / Resized + log.FailOnError(Inst().V.DeleteVolume(eachVolume), "failed to delete volumes") + } + } + stepLog = "Disable trashcan on the cluster" + Step(stepLog, + func() { + log.InfoD(stepLog) + err := EnableTrashcanOnCluster("0") + log.FailOnError(err, "failed to disable trashcan on the cluster") + }) + + }) + + JustAfterEach(func() { + defer EndTorpedoTest() + AfterEachTest(contexts) + }) + +}) + +var _ = Describe("{VolHAIncreaseAllVolumes}", func() { + JustBeforeEach(func() { + StartTorpedoTest("VolHAIncreaseAllVolumes", "Trigger vol HA Increase on all volumes at once", nil, 0) + }) + + itLog := "VolHAIncreaseAllVolumes" + It(itLog, func() { + var contexts []*scheduler.Context + var wg sync.WaitGroup + + stepLog = "Schedule Applications on the cluster and get details of Volumes" + Step(stepLog, func() { + for i := 0; i < Inst().GlobalScaleFactor; i++ { + contexts = append(contexts, ScheduleApplications(fmt.Sprintf("volresizeallvol-%d", i))...) + } + }) + ValidateApplications(contexts) + defer appsValidateAndDestroy(contexts) + + type volMap struct { + ReplSet int64 + volObj *volume.Volume + } + volHAMap := []*volMap{} + + revertReplica := func() { + for _, eachvol := range volHAMap { + getReplicaSets, err := Inst().V.GetReplicaSets(eachvol.volObj) + log.FailOnError(err, "Failed to get replication factor on the volume") + if len(getReplicaSets[0].Nodes) != int(eachvol.ReplSet) { + log.Infof("Reverting Replication factor on Volume [%v] with ID [%v] to [%v]", + eachvol.volObj.Name, eachvol.volObj.ID, eachvol.ReplSet) + err := Inst().V.SetReplicationFactor(eachvol.volObj, eachvol.ReplSet, + nil, nil, true) + log.FailOnError(err, "failed to set replicaiton value of Volume [%v]", eachvol.volObj.Name) + } + } + } + + setReplOnVolumes := func(vol *volume.Volume, curReplSet int64, wait bool, wg *sync.WaitGroup) { + defer wg.Done() + defer GinkgoRecover() + var setRepl int64 + if curReplSet == 1 || curReplSet == 3 { + setRepl = 2 + } else { + setRepl = 3 + } + opts := volume.Options{ + ValidateReplicationUpdateTimeout: replicationUpdateTimeout, + } + log.Infof("Setting Replication factor on Volume [%v] with ID [%v] to [%v]", vol.Name, vol.ID, setRepl) + err = Inst().V.SetReplicationFactor(vol, setRepl, nil, nil, wait, opts) + log.FailOnError(err, fmt.Sprintf("err setting repl factor to %d for vol : %s", setRepl, vol.Name)) + + } + defer revertReplica() + + // Wait for some time so that IO's will generate some data on all the volumes created so that + // HA Update will take some time to finish + time.Sleep(10 * time.Minute) + + getReplFactors := func(vol *volume.Volume) { + defer wg.Done() + defer GinkgoRecover() + volDet := volMap{} + curReplSet, err := Inst().V.GetReplicationFactor(vol) + log.FailOnError(err, "failed to get replication factor of the volume") + volDet.volObj = vol + volDet.ReplSet = curReplSet + log.Infof("Volume [%v] is with HA [%v]", volDet.volObj.Name, volDet.ReplSet) + volHAMap = append(volHAMap, &volDet) + } + + for _, eachCtx := range contexts { + vols, err := Inst().S.GetVolumes(eachCtx) + log.FailOnError(err, "Failed to get list of Volumes in the cluster") + + for _, eachVol := range vols { + wg.Add(1) + log.Infof("Get Repl factor for Volume [%v]", eachVol.Name) + go getReplFactors(eachVol) + } + } + wg.Wait() + + // Wait for all the Volumes in Clean State + for _, eachVol := range volHAMap { + log.FailOnError(WaitForVolumeClean(eachVol.volObj), "is Volume in clean state ?") + } + log.Infof("All Volumes are in clean state, proceeding with HA Update") + + // Set Repl Factor on all the volumes at ones + for _, eachVol := range volHAMap { + wg.Add(1) + log.Infof("Set Repl on Volume [%v] to [%v]", eachVol.volObj.Name, eachVol.ReplSet) + go setReplOnVolumes(eachVol.volObj, eachVol.ReplSet, false, &wg) + } + wg.Wait() + + // Wait for 2 min before validating the volume + time.Sleep(2 * time.Minute) + + log.Infof("Waiting for all volumes in clean state") + // Wait for all the Volumes in Clean State after starting Resync of the volume + for _, eachVol := range volHAMap { + log.FailOnError(WaitForVolumeClean(eachVol.volObj), "is Volume in clean state ?") + } + + // Verify Repl Resync Completed after all volumes are in Clean state + for _, eachVol := range volHAMap { + curReplSet, err := Inst().V.GetReplicationFactor(eachVol.volObj) + log.FailOnError(err, "failed to get replication factor of the volume") + + if eachVol.ReplSet == 3 || eachVol.ReplSet == 1 { + dash.VerifyFatal(curReplSet == 2, true, fmt.Sprintf("Verify if HA Value is 2 for Volume [%v]", eachVol.volObj.Name)) + } else { + dash.VerifyFatal(curReplSet == 3, true, fmt.Sprintf("Verify if HA Value is 3 for Volume [%v]", eachVol.volObj.Name)) + } + } + + }) + + JustAfterEach(func() { + defer EndTorpedoTest() + AfterEachTest(contexts) + }) +}) \ No newline at end of file diff --git a/tests/basic/upgrade_cluster_test.go b/tests/basic/upgrade_cluster_test.go index 4fc357572..caf9990b1 100644 --- a/tests/basic/upgrade_cluster_test.go +++ b/tests/basic/upgrade_cluster_test.go @@ -108,7 +108,7 @@ var _ = Describe("{UpgradeCluster}", func() { time.Sleep(30 * time.Minute) } - PrintK8sCluterInfo() + PrintK8sClusterInfo() }) Step("update node drive endpoints", func() { @@ -133,7 +133,7 @@ var _ = Describe("{UpgradeCluster}", func() { PrintPxctlStatus() } // Printing cluster node info after the upgrade - PrintK8sCluterInfo() + PrintK8sClusterInfo() dash.VerifyFatal(err, nil, fmt.Sprintf("verify volume driver after upgrade to %s", version)) }) diff --git a/tests/basic/upgrade_test.go b/tests/basic/upgrade_test.go index caed99ab9..4d29fd235 100644 --- a/tests/basic/upgrade_test.go +++ b/tests/basic/upgrade_test.go @@ -457,7 +457,8 @@ var _ = Describe("{UpgradeVolumeDriverFromCatalog}", func() { imageList, err := optest.GetImagesFromVersionURL(upgradeHop, k8sVersion.String()) log.FailOnError(err, "error getting images using URL [%s] and k8s version [%s]", upgradeHop, k8sVersion.String()) - err = optest.ValidateStorageCluster(imageList, stc, ValidateStorageClusterTimeout, defaultRetryInterval, true) + storageClusterValidateTimeout := time.Duration(len(node.GetStorageDriverNodes())*9) * time.Minute + err = optest.ValidateStorageCluster(imageList, stc, storageClusterValidateTimeout, defaultRetryInterval, true) dash.VerifyFatal(err, nil, fmt.Sprintf("Verify PX upgrade from version [%s] to version [%s]", currPXVersion, nextPXVersion)) timeAfterUpgrade = time.Now() diff --git a/tests/basic/volume_ops_test.go b/tests/basic/volume_ops_test.go index 39f87b9bb..25c9c5e18 100644 --- a/tests/basic/volume_ops_test.go +++ b/tests/basic/volume_ops_test.go @@ -344,6 +344,7 @@ var _ = Describe("{VolumeUpdateForAttachedNode}", func() { currRep, err := Inst().V.GetReplicationFactor(v) log.FailOnError(err, "Failed to get vol %s repl factor", v.Name) attachedNode, err := Inst().V.GetNodeForVolume(v, defaultCommandTimeout, defaultCommandRetry) + log.FailOnError(err, fmt.Sprintf("Failed to get node for vol %s", v.Name)) replicaSets, err := Inst().V.GetReplicaSets(v) log.FailOnError(err, "Failed to get vol %s replica sets", v.Name) @@ -421,7 +422,10 @@ var _ = Describe("{VolumeUpdateForAttachedNode}", func() { MaxRF = int64(len(node.GetStorageDriverNodes())) / currAggr } expReplMap[v] = int64(math.Min(float64(MaxRF), float64(currRep)+1)) - err = Inst().V.SetReplicationFactor(v, currRep+1, updateReplicaSet, nil, true) + opts := volume.Options{ + ValidateReplicationUpdateTimeout: validateReplicationUpdateTimeout, + } + err = Inst().V.SetReplicationFactor(v, currRep+1, updateReplicaSet, nil, true, opts) log.FailOnError(err, "Failed to set vol %s repl factor", v.Name) dash.VerifyFatal(err == nil, true, fmt.Sprintf("Vol %s repl factor set as expected?", v.Name)) }) @@ -604,7 +608,7 @@ var _ = Describe("{CreateDeleteVolumeKillKVDBMaster}", func() { }) var contexts []*scheduler.Context - stepLog := "has to schedule apps and update replication factor for attached node" + stepLog := "Continuously creates and deletes volume while killing kvdb master node" It(stepLog, func() { var wg sync.WaitGroup @@ -993,6 +997,9 @@ var _ = Describe("{CloudsnapAndRestore}", func() { retain := 8 interval := 4 + err := CreatePXCloudCredential() + log.FailOnError(err, "failed to create cloud credential") + n := node.GetStorageDriverNodes()[0] uuidCmd := "pxctl cred list -j | grep uuid" output, err := runCmd(uuidCmd, n) @@ -1038,11 +1045,19 @@ var _ = Describe("{CloudsnapAndRestore}", func() { }) + defer func() { + err := storkops.Instance().DeleteSchedulePolicy(policyName) + log.FailOnError(err, fmt.Sprintf("error deleting a SchedulePolicy [%s]", policyName)) + }() + stepLog = "Verify that cloud snap status" Step(stepLog, func() { log.InfoD(stepLog) for _, ctx := range contexts { + if !strings.Contains(ctx.App.Key, "cloudsnap") { + continue + } var appVolumes []*volume.Volume var err error appNamespace := ctx.App.Key + "-" + ctx.UID @@ -1130,6 +1145,9 @@ var _ = Describe("{CloudsnapAndRestore}", func() { stepLog = "Validating cloud snapshot backup size values" Step(stepLog, func() { for _, ctx := range contexts { + if !strings.Contains(ctx.App.Key, "cloudsnap") { + continue + } // Validate the cloud snapshot backup size values [PTX-17342] log.Infof("Validating cloud snapshot backup size values for app [%s]", ctx.App.Key) vols, err := Inst().S.GetVolumeParameters(ctx) @@ -1218,27 +1236,31 @@ var _ = Describe("{CloudsnapAndRestore}", func() { } else { log.FailOnError(fmt.Errorf("no snapshot with Ready status found for vol[%s] in namespace[%s]", vol.Name, vol.Namespace), "error getting volume snapshot") } - } - } } - }) - stepLog = "Validating and Destroying apps" + + stepLog = "Validating apps after cloudsnap restore" Step(stepLog, func() { + for _, ctx := range contexts { ctx.ReadinessTimeout = 15 * time.Minute - ctx.SkipVolumeValidation = false + //skipping volume validation as ip_profiles are updated + ctx.SkipVolumeValidation = true ValidateContext(ctx) - opts := make(map[string]bool) - DestroyApps(contexts, opts) } }) }) JustAfterEach(func() { defer EndTorpedoTest() + bucketName, err := GetCloudsnapBucketName(contexts) + log.FailOnError(err, "error getting cloud snap bucket name") + opts := make(map[string]bool) + DestroyApps(contexts, opts) + err = DeleteCloudSnapBucket(bucketName) + log.FailOnError(err, "error deleting cloud snap bucket") AfterEachTest(contexts) }) }) @@ -1524,7 +1546,7 @@ var _ = Describe("{ResizeVolumeAfterFull}", func() { waitForVolumeFull := func(volName *volume.Volume) error { waitTillVolume := func() (interface{}, bool, error) { - volumeFull, err := IsVolumeFull(*randomVol) + volumeFull, err := IsVolumeFull(*volName) if err != nil { return nil, true, err } @@ -1730,6 +1752,9 @@ var _ = Describe("{TrashcanRecoveryWithCloudsnap}", func() { stepLog := "Validate the successful restore from Trashcan of volume in resync" It(stepLog, func() { log.InfoD(stepLog) + err := CreatePXCloudCredential() + log.FailOnError(err, "failed to create cloud credential") + stepLog = "Enable Trashcan" Step(stepLog, func() { @@ -1766,6 +1791,12 @@ var _ = Describe("{TrashcanRecoveryWithCloudsnap}", func() { log.FailOnError(err, fmt.Sprintf("error creating a SchedulePolicy [%s]", policyName)) } }) + + defer func() { + err := storkops.Instance().DeleteSchedulePolicy(policyName) + log.FailOnError(err, fmt.Sprintf("error deleting a SchedulePolicy [%s]", policyName)) + + }() fioPVC := "fio-pvc" fioPVName := "fio-pv" fioOutputPVC := "fio-output-pvc" @@ -2006,6 +2037,12 @@ var _ = Describe("{TrashcanRecoveryWithCloudsnap}", func() { }) JustAfterEach(func() { defer EndTorpedoTest() + bucketName, err := GetCloudsnapBucketName(contexts) + log.FailOnError(err, "error getting cloud snap bucket name") + opts := make(map[string]bool) + DestroyApps(contexts, opts) + err = DeleteCloudSnapBucket(bucketName) + log.FailOnError(err, "error deleting cloud snap bucket") AfterEachTest(contexts) }) }) @@ -2103,6 +2140,9 @@ func validateCloudSnaps(appNamespace string) (map[string]string, error) { return snapsMap, fmt.Errorf("snapshotSchedule has an empty migration in it's most recent status,Err: %v", err) } status, err = WaitForSnapShotToReady(snapshotScheduleName, status.Name, appNamespace) + if err != nil { + return snapsMap, err + } log.Infof("Snapshot %s has status %v", status.Name, status.Status) if status.Status == snapv1.VolumeSnapshotConditionError { @@ -2246,17 +2286,8 @@ var _ = Describe("{CloudSnapWithPXEvents}", func() { stepLog = "validate cloud cred and create schedule policy" Step(stepLog, func() { log.InfoD(stepLog) - n := node.GetStorageDriverNodes()[0] - uuidCmd := "pxctl cred list -j | grep uuid" - output, err := runCmd(uuidCmd, n) - log.FailOnError(err, "error getting uuid for cloudsnap credential") - if output == "" { - log.FailOnError(fmt.Errorf("cloud cred is not created"), "Check for cloud cred exists?") - } - - credUUID := strings.Split(strings.TrimSpace(output), " ")[1] - credUUID = strings.ReplaceAll(credUUID, "\"", "") - log.Infof("Got Cred UUID: %s", credUUID) + err := CreatePXCloudCredential() + log.FailOnError(err, "failed to create cloud credential") contexts = make([]*scheduler.Context, 0) policyName := "intervalpolicy" @@ -2285,6 +2316,11 @@ var _ = Describe("{CloudSnapWithPXEvents}", func() { } }) + defer func() { + err := storkops.Instance().DeleteSchedulePolicy(policyName) + log.FailOnError(err, fmt.Sprintf("error deleting a SchedulePolicy [%s]", policyName)) + }() + for i := 0; i < Inst().GlobalScaleFactor; i++ { contexts = append(contexts, ScheduleApplications(fmt.Sprintf("cspxevents-%d", i))...) } @@ -2597,6 +2633,12 @@ var _ = Describe("{CloudSnapWithPXEvents}", func() { }) JustAfterEach(func() { defer EndTorpedoTest() + bucketName, err := GetCloudsnapBucketName(contexts) + log.FailOnError(err, "error getting cloud snap bucket name") + opts := make(map[string]bool) + DestroyApps(contexts, opts) + err = DeleteCloudSnapBucket(bucketName) + log.FailOnError(err, "failed to delete cloud snap bucket") AfterEachTest(contexts, testrailID, runID) }) }) @@ -2625,23 +2667,13 @@ var _ = Describe("{PoolFullCloudsnap}", func() { It(stepLog, func() { stepLog = "Create cloudsnap schedule and validate cloud cred" - + policyName := "intervalpolicy" Step(stepLog, func() { log.InfoD(stepLog) - n := node.GetStorageDriverNodes()[0] - uuidCmd := "pxctl cred list -j | grep uuid" - output, err := runCmd(uuidCmd, n) - log.FailOnError(err, "error getting uuid for cloudsnap credential") - if output == "" { - log.FailOnError(fmt.Errorf("cloud cred is not created"), "Check for cloud cred exists?") - } - - credUUID := strings.Split(strings.TrimSpace(output), " ")[1] - credUUID = strings.ReplaceAll(credUUID, "\"", "") - log.Infof("Got Cred UUID: %s", credUUID) + err := CreatePXCloudCredential() + log.FailOnError(err, "failed to create cloud credential") contexts = make([]*scheduler.Context, 0) - policyName := "intervalpolicy" stepLog = fmt.Sprintf("create schedule policy %s", policyName) Step(stepLog, func() { @@ -2670,6 +2702,11 @@ var _ = Describe("{PoolFullCloudsnap}", func() { }) + defer func() { + err := storkops.Instance().DeleteSchedulePolicy(policyName) + log.FailOnError(err, fmt.Sprintf("error deleting a SchedulePolicy [%s]", policyName)) + }() + log.InfoD(stepLog) existingAppList := Inst().AppList @@ -2849,6 +2886,12 @@ var _ = Describe("{PoolFullCloudsnap}", func() { JustAfterEach(func() { defer EndTorpedoTest() + bucketName, err := GetCloudsnapBucketName(contexts) + log.FailOnError(err, "error getting cloud snap bucket name") + opts := make(map[string]bool) + DestroyApps(contexts, opts) + err = DeleteCloudSnapBucket(bucketName) + log.FailOnError(err, "failed to delete cloud snap bucket") AfterEachTest(contexts, testrailID, runID) }) }) diff --git a/tests/common.go b/tests/common.go index c3842e2ce..175a1e9a4 100644 --- a/tests/common.go +++ b/tests/common.go @@ -10,6 +10,12 @@ import ( "errors" "flag" "fmt" + "k8s.io/apimachinery/pkg/api/resource" + + "github.com/devans10/pugo/flasharray" + + "github.com/aws/aws-sdk-go/aws/awserr" + "io/ioutil" "math/rand" "net/http" @@ -57,6 +63,7 @@ import ( "github.com/portworx/sched-ops/k8s/operator" policyops "github.com/portworx/sched-ops/k8s/policy" k8sStorage "github.com/portworx/sched-ops/k8s/storage" + schedstorage "github.com/portworx/sched-ops/k8s/storage" "github.com/portworx/sched-ops/k8s/stork" storkops "github.com/portworx/sched-ops/k8s/stork" "github.com/portworx/sched-ops/task" @@ -312,6 +319,7 @@ const ( anthosInstPathCliFlag = "anthos-inst-path" skipSystemCheckCliFlag = "torpedo-skip-system-checks" dataIntegrityValidationTestsFlag = "data-integrity-validation-tests" + faSecretCliFlag = "fa-secret" ) // Dashboard params @@ -358,7 +366,7 @@ const ( defaultMonitorDriver = "prometheus" defaultStorageDriver = "pxd" defaultPdsDriver = "pds" - defaultLogLocation = "/tmp/" + defaultLogLocation = "/testresults/" defaultBundleLocation = "/var/cores" defaultLogLevel = "debug" defaultAppScaleFactor = 1 @@ -959,32 +967,52 @@ func ValidatePDB(pdbValue int, allowedDisruptions int, initialNumNodes int, isCl close(*errChan[0]) } }() - - currentPdbValue, _ := GetPDBValue() + t := func() (interface{}, bool, error) { + currentPdbValue, _ := GetPDBValue() + if currentPdbValue == -1 { + return -1, true, fmt.Errorf("failed to get PDB value") + } + return currentPdbValue, false, nil + } + currentPdbValue, _ := task.DoRetryWithTimeout(t, defaultTimeout, defaultRetryInterval) if currentPdbValue == -1 { err := fmt.Errorf("failed to get PDB value") processError(err, errChan...) } + Step("Validate PDB minAvailable for px storage", func() { if currentPdbValue != pdbValue { err := fmt.Errorf("PDB minAvailable value has changed. Expected: %d, Actual: %d", pdbValue, currentPdbValue) processError(err, errChan...) } + }) Step("Validate number of disruptions ", func() { - nodes, err := Inst().V.GetDriverNodes() - if err != nil { - processError(err, errChan...) + t := func() (interface{}, bool, error) { + nodes, err := Inst().V.GetDriverNodes() + if err != nil { + return nil, true, fmt.Errorf("failed to get portworx nodes due to %v. Retrying with timeout", err) + } else { + return nodes, false, nil + } } - currentNumNodes := len(nodes) - if allowedDisruptions < initialNumNodes-currentNumNodes { - err := fmt.Errorf("number of nodes down is more than allowed disruptions . Expected: %d, Actual: %d", allowedDisruptions, initialNumNodes-currentNumNodes) + nodes, err := task.DoRetryWithTimeout(t, defaultTimeout, defaultRetryInterval) + if err != nil { processError(err, errChan...) + } else { + currentNumNodes := len(nodes.([]*opsapi.StorageNode)) + if allowedDisruptions < initialNumNodes-currentNumNodes { + err := fmt.Errorf("number of nodes down is more than allowed disruptions . Expected: %d, Actual: %d", allowedDisruptions, initialNumNodes-currentNumNodes) + processError(err, errChan...) + } + if initialNumNodes-currentNumNodes > 1 { + *isClusterParallelyUpgraded = true + + } } - if initialNumNodes-currentNumNodes > 1 { - *isClusterParallelyUpgraded = true - } + }) + } func GetPDBValue() (int, int) { @@ -1628,6 +1656,7 @@ func ValidateCSIVolumeClone(ctx *scheduler.Context, errChan ...*chan error) { log.Warnf("No FlashArray DirectAccess volumes, skipping") processError(err, errChan...) } else { + log.Infof("==== Cloning volume %s\n", vols[0].Name) timestamp := strconv.Itoa(int(time.Now().Unix())) request := scheduler.CSICloneRequest{ Timestamp: timestamp, @@ -1687,33 +1716,43 @@ func ValidatePureVolumeLargeNumOfClones(ctx *scheduler.Context, errChan ...*chan // ValidatePoolExpansionWithPureVolumes is the ginkgo spec for executing a pool expansion when FA/FB volumes is attached func ValidatePoolExpansionWithPureVolumes(ctx *scheduler.Context, errChan ...*chan error) { Step("For validation of an expanding storage pools while FA/FB volumes are attached", func() { - pools, err := Inst().V.ListStoragePools(metav1.LabelSelector{}) - if err != nil { - err = fmt.Errorf("error getting storage pools list. Err: %v", err) - log.Error(err.Error()) + var vols []*volume.Volume + var err error + Step(fmt.Sprintf("get %s app's pure volumes", ctx.App.Key), func() { + vols, err = Inst().S.GetPureVolumes(ctx, "pure_block") processError(err, errChan...) - } + }) + if len(vols) == 0 { + log.Warnf("No FlashArray DirectAccess volumes, skipping") + } else { - if len(pools) == 0 { - err = fmt.Errorf("length of pools should be greater than 0") - processError(err, errChan...) - } - for _, pool := range pools { - initialPoolSize := pool.TotalSize / units.GiB - err = Inst().V.ResizeStoragePoolByPercentage(pool.Uuid, opsapi.SdkStoragePool_RESIZE_TYPE_RESIZE_DISK, 20) + pools, err := Inst().V.ListStoragePools(metav1.LabelSelector{}) if err != nil { - err = fmt.Errorf("error initiating pool [%v ] %v: [%v]", pool.Uuid, opsapi.SdkStoragePool_RESIZE_TYPE_RESIZE_DISK, err.Error()) + err = fmt.Errorf("error getting storage pools list. Err: %v", err) log.Error(err.Error()) - } else { - err = waitForPoolToBeResized(initialPoolSize, pool.Uuid) + processError(err, errChan...) + } + + if len(pools) == 0 { + err = fmt.Errorf("length of pools should be greater than 0") + processError(err, errChan...) + } + for _, pool := range pools { + initialPoolSize := pool.TotalSize / units.GiB + err = Inst().V.ResizeStoragePoolByPercentage(pool.Uuid, opsapi.SdkStoragePool_RESIZE_TYPE_RESIZE_DISK, 20) if err != nil { - err = fmt.Errorf("pool [%v] %v failed. Error: %v", pool.Uuid, opsapi.SdkStoragePool_RESIZE_TYPE_RESIZE_DISK, err) - log.Error(err) + err = fmt.Errorf("error initiating pool [%v ] %v: [%v]", pool.Uuid, opsapi.SdkStoragePool_RESIZE_TYPE_RESIZE_DISK, err.Error()) + log.Error(err.Error()) + } else { + err = waitForPoolToBeResized(initialPoolSize, pool.Uuid) + if err != nil { + err = fmt.Errorf("pool [%v] %v failed. Error: %v", pool.Uuid, opsapi.SdkStoragePool_RESIZE_TYPE_RESIZE_DISK, err) + log.Error(err) + } } } } }) - } // ValidateMountOptionsWithPureVolumes is the ginkgo spec for executing a check for mountOptions flag @@ -1731,10 +1770,18 @@ func ValidateMountOptionsWithPureVolumes(ctx *scheduler.Context, errChan ...*cha log.FailOnError(err, " Error Occured while getting storage class for pvc %s", pvcObj) } if strings.Contains(strings.Join(sc.MountOptions, ""), "nosuid") { - attachedNode, err := Inst().V.GetNodeForVolume(vol, defaultCmdTimeout*3, defaultCmdRetryInterval) - log.FailOnError(err, "Failed to get app %s's attachednode", ctx.App.Key) - err = Inst().V.ValidatePureFaFbMountOptions(vol.ID, requiredMountOptions, attachedNode) - dash.VerifySafely(err, nil, "Testing mount options are properly applied on pure volumes") + // Ignore mount path check if the volume type is purefile, https://purestorage.atlassian.net/issues/PWX-37040 + isPureFile, err := Inst().V.IsPureFileVolume(vol) + log.FailOnError(err, "Failed to get details about PureFile") + log.Infof("Given Volume is [%v] and PureFile [%v]", vol.Name, isPureFile) + + if !isPureFile { + attachedNode, err := Inst().V.GetNodeForVolume(vol, defaultCmdTimeout*3, defaultCmdRetryInterval) + log.FailOnError(err, "Failed to get app %s's attachednode", ctx.App.Key) + + err = Inst().V.ValidatePureFaFbMountOptions(vol.ID, requiredMountOptions, attachedNode) + dash.VerifySafely(err, nil, "Testing mount options are properly applied on pure volumes") + } } else { log.Infof("There is no nosuid mount option in this volume %s", vol) } @@ -1760,23 +1807,28 @@ func ValidateCreateOptionsWithPureVolumes(ctx *scheduler.Context, errChan ...*ch processError(err, errChan...) } - attachedNode, err := Inst().V.GetNodeForVolume(v, defaultCmdTimeout*3, defaultCmdRetryInterval) - if err != nil { - err = fmt.Errorf("Failed to get app %s's attachednode. Err: %v", ctx.App.Key, err) - processError(err, errChan...) - } - if strings.Contains(fmt.Sprint(sc.Parameters), "-b ") { - FSType, ok := sc.Parameters["csi.storage.k8s.io/fstype"] - if ok { - err = Inst().V.ValidatePureFaCreateOptions(v.ID, FSType, attachedNode) - dash.VerifySafely(err, nil, "File system create options specified in the storage class are properly applied to the pure volumes") + isPureFile, err := Inst().V.IsPureFileVolume(v) + log.FailOnError(err, "Failed to get details about PureFile") + log.Infof("Given Volume is [%v] and PureFile [%v]", v.Name, isPureFile) + + if !isPureFile { + attachedNode, err := Inst().V.GetNodeForVolume(v, defaultCmdTimeout*3, defaultCmdRetryInterval) + if err != nil { + err = fmt.Errorf("Failed to get app %s's attachednode. Err: %v", ctx.App.Key, err) + processError(err, errChan...) + } + if strings.Contains(fmt.Sprint(sc.Parameters), "-b ") { + FSType, ok := sc.Parameters["csi.storage.k8s.io/fstype"] + if ok { + err = Inst().V.ValidatePureFaCreateOptions(v.ID, FSType, attachedNode) + dash.VerifySafely(err, nil, "File system create options specified in the storage class are properly applied to the pure volumes") + } else { + log.Infof("Storage class doesn't have key 'csi.storage.k8s.io/fstype' in parameters") + } } else { - log.Infof("Storage class doesn't have key 'csi.storage.k8s.io/fstype' in parameters") + log.Infof("Storage class doesn't have createoption -b of size 2048 added to it") } - } else { - log.Infof("Storage class doesn't have createoption -b of size 2048 added to it") } - } } @@ -2469,6 +2521,7 @@ func DestroyAppsWithData(contexts []*scheduler.Context, opts map[string]bool, co TearDownContext(ctx, opts) } + /* Removing Data error validation till PB-6271 is resolved. if allErrors != "" { if IsReplacePolicySetToDelete { log.Infof("Skipping data continuity check as the replace policy was set to delete in this scenario") @@ -2478,6 +2531,7 @@ func DestroyAppsWithData(contexts []*scheduler.Context, opts map[string]bool, co return fmt.Errorf("Data validation failed for apps. Error - [%s]", allErrors) } } + */ return nil } @@ -2775,6 +2829,16 @@ func ValidateClusterSize(count int64) { currentNodeCount, err := Inst().S.GetASGClusterSize() log.FailOnError(err, "Failed to Get ASG Cluster Size") + if Inst().S.String() == openshift.SchedName { + isPxOnMaster, err := IsPxRunningOnMaster() + log.FailOnError(err, "Failed to check if px is running on master") + if !isPxOnMaster { + node.GetMasterNodes() + //Removing master nodes for currentNodeCount + currentNodeCount = currentNodeCount - int64(len(node.GetMasterNodes())) + } + } + dash.VerifyFatal(currentNodeCount, count, "ASG cluster size is as expected?") // Validate storage node count @@ -2788,6 +2852,29 @@ func ValidateClusterSize(count int64) { dash.VerifyFatal(len(storageNodes), expectedStoragesNodes, "Storage nodes matches the expected number?") } +func IsPxRunningOnMaster() (bool, error) { + + var namespace string + var err error + if namespace, err = Inst().S.GetPortworxNamespace(); err != nil { + log.Errorf("Failed to get portworx namespace. Error : %v", err) + return false, nil + } + var isPXOnControlplane = false + pxOperator := operator.Instance() + stcList, err := pxOperator.ListStorageClusters(namespace) + if err == nil { + stc, err := pxOperator.GetStorageCluster(stcList.Items[0].Name, stcList.Items[0].Namespace) + if err != nil { + return false, fmt.Errorf("failed to get StorageCluster [%s] from namespace [%s], Err: %v", stcList.Items[0].Name, stcList.Items[0].Namespace, err.Error()) + } + isPXOnControlplane, _ = strconv.ParseBool(stc.Annotations["portworx.io/run-on-master"]) + } + + return isPXOnControlplane, nil + +} + // GetStorageNodes get storage nodes in the cluster func GetStorageNodes() ([]node.Node, error) { @@ -2886,7 +2973,9 @@ func runCmd(cmd string, n node.Node) error { func runCmdOnce(cmd string, n node.Node) (string, error) { output, err := Inst().N.RunCommandWithNoRetry(n, cmd, node.ConnectionOpts{ - Sudo: true, + Timeout: defaultCmdTimeout, + TimeBeforeRetry: defaultCmdRetryInterval, + Sudo: true, }) if err != nil { log.Warnf("failed to run cmd: %s. err: %v", cmd, err) @@ -6788,6 +6877,7 @@ type Torpedo struct { AnthosAdminWorkStationNodeIP string AnthosInstPath string SkipSystemChecks bool + FaSecret string } // ParseFlags parses command line flags @@ -6847,6 +6937,8 @@ func ParseFlags() { var torpedoJobType string var anthosWsNodeIp string var anthosInstPath string + var faSecret string + log.Infof("The default scheduler is %v", defaultScheduler) flag.StringVar(&s, schedulerCliFlag, defaultScheduler, "Name of the scheduler to use") flag.StringVar(&n, nodeDriverCliFlag, defaultNodeDriver, "Name of the node driver to use") @@ -6920,6 +7012,8 @@ func ParseFlags() { flag.StringVar(&pdsDriverName, pdsDriveCliFlag, defaultPdsDriver, "Name of the pdsdriver to use") flag.StringVar(&anthosWsNodeIp, anthosWsNodeIpCliFlag, "", "Anthos admin work station node IP") flag.StringVar(&anthosInstPath, anthosInstPathCliFlag, "", "Anthos config path where all conf files present") + flag.StringVar(&faSecret, faSecretCliFlag, "", "comma seperated list of famanagementip=tokenValue pairs") + // System checks https://github.com/portworx/torpedo/blob/86232cb195400d05a9f83d57856f8f29bdc9789d/tests/common.go#L2173 // should be skipped from AfterSuite() if this flag is set to true. This is to avoid distracting test failures due to // unstable testing environments. @@ -7155,6 +7249,7 @@ func ParseFlags() { AnthosInstPath: anthosInstPath, IsPDSApps: deployPDSApps, SkipSystemChecks: skipSystemChecks, + FaSecret: faSecret, } if instance.S.String() == "openshift" { instance.LogLoc = "/mnt" @@ -8343,18 +8438,17 @@ func GetPoolExpansionEligibility(stNode *node.Node) (map[string]bool, error) { var maxCloudDrives int - if _, err := core.Instance().GetSecret(PX_VSPHERE_SCERET_NAME, namespace); err == nil { + if _, err = core.Instance().GetSecret(PX_VSPHERE_SCERET_NAME, namespace); err == nil { + maxCloudDrives = VSPHERE_MAX_CLOUD_DRIVES + } + if _, err = core.Instance().GetSecret(PX_VSPHERE_SCERET_NAME, namespace); err == nil { maxCloudDrives = VSPHERE_MAX_CLOUD_DRIVES - } else if _, err := core.Instance().GetSecret(PX_PURE_SECRET_NAME, namespace); err == nil { + } else if _, err = core.Instance().GetSecret(PX_PURE_SECRET_NAME, namespace); err == nil { maxCloudDrives = FA_MAX_CLOUD_DRIVES } else { maxCloudDrives = CLOUD_PROVIDER_MAX_CLOUD_DRIVES } - if err != nil { - return nil, err - } - var currentNodeDrives int drvM, err := Inst().V.GetPoolDrives(stNode) @@ -8691,6 +8785,7 @@ func WaitForPoolOffline(n node.Node) error { return err } +// GetPoolIDFromPoolUUID Returns Pool ID from Pool UUID func GetPoolIDFromPoolUUID(poolUuid string) (int32, error) { nodesPresent := node.GetStorageNodes() for _, each := range nodesPresent { @@ -8707,6 +8802,20 @@ func GetPoolIDFromPoolUUID(poolUuid string) (int32, error) { return -1, nil } +// GetPoolObjFromPoolIdOnNode Returns pool object from pool ID on a specific Node +func GetPoolObjFromPoolIdOnNode(n *node.Node, poolID int) (*opsapi.StoragePool, error) { + poolDetails, err := GetPoolsDetailsOnNode(n) + if err != nil { + return nil, err + } + for _, eachPool := range poolDetails { + if eachPool.ID == int32(poolID) { + return eachPool, nil + } + } + return nil, fmt.Errorf("Failed to get details of Storage Pool On specific Node ") +} + func GetAutoFsTrimStatusForCtx(ctx *scheduler.Context) (map[string]opsapi.FilesystemTrim_FilesystemTrimStatus, error) { appVolumes, err := Inst().S.GetVolumes(ctx) @@ -9398,17 +9507,21 @@ func AddMetadataDisk(n node.Node) error { } -// createNamespaces Create N number of namespaces and return namespace list -func createNamespaces(numberOfNamespaces int) ([]string, error) { +// CreateNamespaces Create N number of namespaces and return namespace list +func CreateNamespaces(nsName string, numberOfNamespaces int) ([]string, error) { // Create multiple namespaces in string var ( namespaces []string ) + namespace := fmt.Sprintf("large-resource-%v", time.Now().Unix()) + if nsName != "" { + namespace = fmt.Sprintf("%s", nsName) + } // Create a good number of namespaces - for i := 0; i < numberOfNamespaces; i++ { - namespace := fmt.Sprintf("large-resource-%d-%v", i, time.Now().Unix()) + for nsCount := 0; nsCount < numberOfNamespaces; nsCount++ { + namespace := fmt.Sprintf("%v-%v", namespace, nsCount) nsName := &corev1.Namespace{ ObjectMeta: metav1.ObjectMeta{ Name: namespace, @@ -11159,10 +11272,11 @@ func installGrafana(namespace string) { } func SetupProxyServer(n node.Node) error { - createDirCommand := "mkdir -p /exports/testnfsexportdir" output, err := Inst().N.RunCommandWithNoRetry(n, createDirCommand, node.ConnectionOpts{ - Sudo: true, + Sudo: true, + TimeBeforeRetry: defaultRetryInterval, + Timeout: defaultTimeout, }) if err != nil { return err @@ -11171,7 +11285,9 @@ func SetupProxyServer(n node.Node) error { addVersionCmd := "echo -e \"MOUNTD_NFS_V4=\"yes\"\nRPCNFSDARGS=\"-N 2 -N 4\"\" >> /etc/sysconfig/nfs" output, err = Inst().N.RunCommandWithNoRetry(n, addVersionCmd, node.ConnectionOpts{ - Sudo: true, + Sudo: true, + TimeBeforeRetry: defaultRetryInterval, + Timeout: defaultTimeout, }) if err != nil { return err @@ -11180,15 +11296,65 @@ func SetupProxyServer(n node.Node) error { updateExportsCmd := "echo \"/exports/testnfsexportdir *(rw,sync,no_root_squash)\" > /etc/exports" output, err = Inst().N.RunCommandWithNoRetry(n, updateExportsCmd, node.ConnectionOpts{ - Sudo: true, + Sudo: true, + TimeBeforeRetry: defaultRetryInterval, + Timeout: defaultTimeout, }) if err != nil { return err } log.Infof(output) + + checkExportfsCmd := "which exportfs" + output, err = Inst().N.RunCommandWithNoRetry(n, checkExportfsCmd, node.ConnectionOpts{ + Sudo: true, + TimeBeforeRetry: defaultRetryInterval, + Timeout: defaultTimeout, + }) + if err != nil || output == "" { + log.Warnf("The command exportfs not found") + + var installNfsUtilsCmd string + checkDistroCmd := "source /etc/os-release && echo $ID" + output, err = Inst().N.RunCommandWithNoRetry(n, checkDistroCmd, node.ConnectionOpts{ + Sudo: true, + TimeBeforeRetry: defaultRetryInterval, + Timeout: defaultTimeout, + }) + if err != nil { + return err + } + log.Infof("The Linux distribution is %s", output) + + switch strings.TrimSpace(output) { + case "ubuntu", "debian": + log.Infof("Installing nfs-common") + installNfsUtilsCmd = "apt-get update && apt-get install -y nfs-common" + case "centos", "rhel", "fedora": + log.Infof("Installing nfs-utils") + installNfsUtilsCmd = "yum install -y nfs-utils" + default: + return fmt.Errorf("unsupported Linux distribution") + } + + output, err = Inst().N.RunCommandWithNoRetry(n, installNfsUtilsCmd, node.ConnectionOpts{ + Sudo: true, + TimeBeforeRetry: defaultRetryInterval, + Timeout: defaultTimeout, + }) + if err != nil { + return err + } + log.Infof(output) + } else { + log.Infof(output) + } + exportCmd := "exportfs -a" output, err = Inst().N.RunCommandWithNoRetry(n, exportCmd, node.ConnectionOpts{ - Sudo: true, + Sudo: true, + TimeBeforeRetry: defaultRetryInterval, + Timeout: defaultTimeout, }) if err != nil { return err @@ -11197,7 +11363,9 @@ func SetupProxyServer(n node.Node) error { enableNfsServerCmd := "systemctl enable nfs-server" output, err = Inst().N.RunCommandWithNoRetry(n, enableNfsServerCmd, node.ConnectionOpts{ - Sudo: true, + Sudo: true, + TimeBeforeRetry: defaultRetryInterval, + Timeout: defaultTimeout, }) if err != nil { return err @@ -11206,7 +11374,9 @@ func SetupProxyServer(n node.Node) error { startNfsServerCmd := "systemctl restart nfs-server" output, err = Inst().N.RunCommandWithNoRetry(n, startNfsServerCmd, node.ConnectionOpts{ - Sudo: true, + Sudo: true, + TimeBeforeRetry: defaultRetryInterval, + Timeout: defaultTimeout, }) if err != nil { return err @@ -11318,7 +11488,7 @@ func GetClusterNodesInfo(stopSignal <-chan struct{}, mError *error) { } // PrintK8sClusterInfo prints info about K8s cluster nodes -func PrintK8sCluterInfo() { +func PrintK8sClusterInfo() { log.Info("Get cluster info..") t := func() (interface{}, bool, error) { nodeList, err := core.Instance().GetNodes() @@ -11326,16 +11496,16 @@ func PrintK8sCluterInfo() { return "", true, fmt.Errorf("failed to get nodes, Err %v", err) } if len(nodeList.Items) > 0 { - for _, node := range nodeList.Items { + for _, n := range nodeList.Items { nodeType := "Worker" - if core.Instance().IsNodeMaster(node) { + if core.Instance().IsNodeMaster(n) { nodeType = "Master" } log.Infof( "Node Name: %s, Node Type: %s, Kernel Version: %s, Kubernetes Version: %s, OS: %s, Container Runtime: %s", - node.Name, nodeType, - node.Status.NodeInfo.KernelVersion, node.Status.NodeInfo.KubeletVersion, node.Status.NodeInfo.OSImage, - node.Status.NodeInfo.ContainerRuntimeVersion) + n.Name, nodeType, + n.Status.NodeInfo.KernelVersion, n.Status.NodeInfo.KubeletVersion, n.Status.NodeInfo.OSImage, + n.Status.NodeInfo.ContainerRuntimeVersion) } return "", false, nil } @@ -11346,73 +11516,366 @@ func PrintK8sCluterInfo() { } } -// ExportSourceKubeConfig changes the KUBECONFIG environment variable to the source cluster config path -func ExportSourceKubeConfig() error { - sourceClusterConfigPath, err := GetSourceClusterConfigPath() +func CreatePXCloudCredential() error { + /* + Creating a cloud credential for cloudsnap wit the given params + Deleting the existing cred if exists so that we can use same creds to delete the s3 bucket once test is completed. + */ + id, secret, endpoint, s3Region, disableSSl, err := getCreateCredParams() + if err != nil { return err } - err = os.Unsetenv("KUBECONFIG") + + n := node.GetStorageDriverNodes()[0] + uuidCmd := "cred list -j | grep uuid" + + output, err := Inst().V.GetPxctlCmdOutputConnectionOpts(n, uuidCmd, node.ConnectionOpts{ + IgnoreError: false, + TimeBeforeRetry: defaultRetryInterval, + Timeout: defaultTimeout, + }, false) if err != nil { - return err + log.Warnf("No creds found, creating new cred, Err: %v", err) } - return os.Setenv("KUBECONFIG", sourceClusterConfigPath) -} -// ExportDestinationKubeConfig changes the KUBECONFIG environment variable to the destination cluster config path -func ExportDestinationKubeConfig() error { - DestinationClusterConfigPath, err := GetDestinationClusterConfigPath() - if err != nil { - return err + if output != "" { + log.Infof("Cloud Cred exists [%s]", output) + log.Warnf("Deleting existing cred and creating new cred with given params") + credUUID := strings.Split(output, ":")[1] + credUUID = strings.ReplaceAll(strings.TrimSpace(credUUID), "\"", "") + credDeleteCmd := fmt.Sprintf("cred delete %s", credUUID) + output, err = Inst().V.GetPxctlCmdOutputConnectionOpts(n, credDeleteCmd, node.ConnectionOpts{ + IgnoreError: false, + TimeBeforeRetry: defaultRetryInterval, + Timeout: defaultTimeout, + }, false) + + if err != nil { + err = fmt.Errorf("error deleting existing cred [%s], cause: %v", credUUID, err) + return err + } + + log.Infof("Deleted exising cred [%s]", output) } - err = os.Unsetenv("KUBECONFIG") + cloudCredName := "px-cloud-cred" + + credCreateCmd := fmt.Sprintf("cred create %s --provider s3 --s3-access-key %s --s3-secret-key %s --s3-endpoint %s --s3-region %s", cloudCredName, id, secret, endpoint, s3Region) + + if disableSSl { + credCreateCmd = fmt.Sprintf("%s --s3-disable-ssl", credCreateCmd) + } + + log.Infof("Running command [%s]", credCreateCmd) + + // Execute the command and check get rebalance status + output, err = Inst().V.GetPxctlCmdOutputConnectionOpts(node.GetStorageNodes()[0], credCreateCmd, node.ConnectionOpts{ + IgnoreError: false, + TimeBeforeRetry: defaultRetryInterval, + Timeout: defaultTimeout, + }, false) + if err != nil { + err = fmt.Errorf("error creating cloud cred, cause: %v", err) return err } - return os.Setenv("KUBECONFIG", DestinationClusterConfigPath) + + log.Infof(output) + + return nil + } -// SwitchBothKubeConfigANDContext switches both KUBECONFIG and context to the given cluster -func SwitchBothKubeConfigANDContext(cluster string) error { - if cluster == "source" { - err := ExportSourceKubeConfig() - if err != nil { - return err +func GetCloudsnapBucketName(contexts []*scheduler.Context) (string, error) { + + var bucketName string + //Stopping cloudnsnaps before bucket deletion + for _, ctx := range contexts { + if strings.Contains(ctx.App.Key, "cloudsnap") { + if bucketName == "" { + vols, err := Inst().S.GetVolumeParameters(ctx) + if err != nil { + err = fmt.Errorf("error getting volume params for %s, cause: %v", ctx.App.Key, err) + return "", err + } + for vol, params := range vols { + csBksps, err := Inst().V.GetCloudsnaps(vol, params) + if err != nil { + err = fmt.Errorf("error getting cloud snaps for %s, cause: %v", vol, err) + return "", err + } + for _, csBksp := range csBksps { + bkid := csBksp.GetId() + bucketName = strings.Split(bkid, "/")[0] + break + } + } + log.Infof("Got Bucket Name [%s]", bucketName) + } + vols, err := Inst().S.GetVolumes(ctx) + if err != nil { + return "", err + } + for _, vol := range vols { + appVol, err := Inst().V.InspectVolume(vol.ID) + if err != nil { + return "", err + } + err = suspendCloudsnapBackup(appVol.Id) + if err != nil { + return "", err + } + } } - err = SetSourceKubeConfig() + } + return bucketName, nil +} + +func DeleteCloudSnapBucket(bucketName string) error { + + if bucketName != "" { + id, secret, endpoint, s3Region, _, err := getCreateCredParams() if err != nil { return err } - } else if cluster == "destination" { - err := ExportDestinationKubeConfig() - if err != nil { - return err + var sess *session.Session + if strings.Contains(endpoint, "minio") { + + sess, err = session.NewSessionWithOptions(session.Options{ + Config: aws.Config{ + Endpoint: aws.String(endpoint), + Region: aws.String(s3Region), + Credentials: credentials.NewStaticCredentials(id, secret, ""), + S3ForcePathStyle: aws.Bool(true), + }, + }) + if err != nil { + return fmt.Errorf("failed to initialize new session: %v", err) + } } - err = SetDestinationKubeConfig() + + if strings.Contains(endpoint, "amazonaws") { + sess, err = session.NewSessionWithOptions(session.Options{ + Config: aws.Config{ + Region: aws.String(s3Region), + Credentials: credentials.NewStaticCredentials(id, secret, ""), + }, + }) + if err != nil { + return fmt.Errorf("failed to initialize new session: %v", err) + } + } + + if sess == nil { + return fmt.Errorf("failed to initialize new session using endpoint [%s], Cause: %v", endpoint, err) + } + + client := s3.New(sess) + err = deleteAndValidateBucketDeletion(client, bucketName) if err != nil { return err } } + return nil } -// DoPDBValidation continuously validates the Pod Disruption Budget against -// cluster upgrades, appending errors to mError, until a stop signal is received. -func DoPDBValidation(stopSignal <-chan struct{}, mError *error) { - pdbValue, allowedDisruptions := GetPDBValue() - isClusterParallelyUpgraded := false - nodes, err := Inst().V.GetDriverNodes() - if err != nil { - *mError = multierr.Append(*mError, err) - return - } - totalNodes := len(nodes) - itr := 1 - for { - log.Infof("PDB validation iteration: #%d", itr) - select { - case <-stopSignal: +func deleteAndValidateBucketDeletion(client *s3.S3, bucketName string) error { + // Delete all objects and versions in the bucket + log.Debugf("Deleting bucket [%s]", bucketName) + time.Sleep(5 * time.Minute) + err := client.ListObjectsV2Pages(&s3.ListObjectsV2Input{ + Bucket: aws.String(bucketName), + }, func(page *s3.ListObjectsV2Output, lastPage bool) bool { + // Iterate through the objects in the bucket and delete them + var objects []*s3.ObjectIdentifier + for _, obj := range page.Contents { + objects = append(objects, &s3.ObjectIdentifier{ + Key: obj.Key, + }) + } + + _, err := client.DeleteObjects(&s3.DeleteObjectsInput{ + Bucket: aws.String(bucketName), + Delete: &s3.Delete{ + Objects: objects, + Quiet: aws.Bool(true), + }, + }) + if err != nil { + fmt.Printf("Failed to delete objects in bucket: %v\n", err) + return false + } + + return true + }) + if err != nil { + return fmt.Errorf("failed to delete objects in bucket: %v", err) + } + + // Delete the bucket + _, err = client.DeleteBucket(&s3.DeleteBucketInput{ + Bucket: aws.String(bucketName), + }) + if err != nil { + var aerr awserr.Error + if errors.As(err, &aerr) { + if aerr.Code() == s3.ErrCodeNoSuchBucket { + log.Infof("Bucket: %v doesn't exist.!!", bucketName) + return nil + } + return fmt.Errorf("couldn't delete bucket: %v", err) + } + } + + log.Infof("Successfully deleted the bucket: %v", bucketName) + return nil +} + +func suspendCloudsnapBackup(volId string) error { + + isBackupActive, err := IsCloudsnapBackupActiveOnVolume(volId) + if err != nil { + return fmt.Errorf("error checking backup status for volume [%s],Err: %v ", volId, err) + } + log.Infof("Backup status for vol [%s]: %v", volId, isBackupActive) + + if isBackupActive { + scheduleOfVol, err := GetVolumeSnapShotScheduleOfVol(volId) + if err != nil { + return fmt.Errorf("error getting volumes snapshot schedule for volume [%s],Err: %v ", volId, err) + } + + if !*scheduleOfVol.Spec.Suspend { + log.Infof("Snapshot schedule is not suspended. Suspending it") + makeSuspend := true + scheduleOfVol.Spec.Suspend = &makeSuspend + _, err := storkops.Instance().UpdateSnapshotSchedule(scheduleOfVol) + if err != nil { + return fmt.Errorf("error suspending volumes snapshot schedule for volume [%s],Err: %v ", volId, err) + } + + } + } + return nil +} + +func getCreateCredParams() (id, secret, endpoint, s3Region string, disableSSLBool bool, err error) { + + id = os.Getenv("S3_AWS_ACCESS_KEY_ID") + if id == "" { + id = os.Getenv("AWS_ACCESS_KEY_ID") + } + + if id == "" { + err = fmt.Errorf("S3_AWS_ACCESS_KEY_ID or AWS_ACCESS_KEY_ID Environment variable is not provided") + return + + } + + secret = os.Getenv("S3_AWS_SECRET_ACCESS_KEY") + if secret == "" { + secret = os.Getenv("AWS_SECRET_ACCESS_KEY") + } + if secret == "" { + err = fmt.Errorf("S3_AWS_SECRET_ACCESS_KEY or AWS_SECRET_ACCESS_KEY Environment variable is not provided") + return + } + + endpoint = os.Getenv("S3_ENDPOINT") + if endpoint == "" { + err = fmt.Errorf("S3_ENDPOINT Environment variable is not provided") + return + } + + s3Region = os.Getenv("S3_REGION") + if s3Region == "" { + err = fmt.Errorf("S3_REGION Environment variable is not provided") + return + } + + disableSSL := os.Getenv("S3_DISABLE_SSL") + disableSSLBool = false + + if len(disableSSL) > 0 { + disableSSLBool, err = strconv.ParseBool(disableSSL) + if err != nil { + err = fmt.Errorf("S3_DISABLE_SSL=%s is not a valid boolean value,err: %v", disableSSL, err) + return + } + } + + return +} + +// ExportSourceKubeConfig changes the KUBECONFIG environment variable to the source cluster config path +func ExportSourceKubeConfig() error { + sourceClusterConfigPath, err := GetSourceClusterConfigPath() + if err != nil { + return err + } + err = os.Unsetenv("KUBECONFIG") + if err != nil { + return err + } + return os.Setenv("KUBECONFIG", sourceClusterConfigPath) +} + +// ExportDestinationKubeConfig changes the KUBECONFIG environment variable to the destination cluster config path +func ExportDestinationKubeConfig() error { + DestinationClusterConfigPath, err := GetDestinationClusterConfigPath() + if err != nil { + return err + } + + err = os.Unsetenv("KUBECONFIG") + if err != nil { + return err + } + return os.Setenv("KUBECONFIG", DestinationClusterConfigPath) +} + +// SwitchBothKubeConfigANDContext switches both KUBECONFIG and context to the given cluster +func SwitchBothKubeConfigANDContext(cluster string) error { + if cluster == "source" { + err := ExportSourceKubeConfig() + if err != nil { + return err + } + err = SetSourceKubeConfig() + if err != nil { + return err + } + } else if cluster == "destination" { + err := ExportDestinationKubeConfig() + if err != nil { + return err + } + err = SetDestinationKubeConfig() + if err != nil { + return err + } + } + return nil +} + +// DoPDBValidation continuously validates the Pod Disruption Budget against +// cluster upgrades, appending errors to mError, until a stop signal is received. +func DoPDBValidation(stopSignal <-chan struct{}, mError *error) { + pdbValue, allowedDisruptions := GetPDBValue() + isClusterParallelyUpgraded := false + nodes, err := Inst().V.GetDriverNodes() + if err != nil { + *mError = multierr.Append(*mError, err) + return + } + totalNodes := len(nodes) + itr := 1 + for { + log.Infof("PDB validation iteration: #%d", itr) + select { + case <-stopSignal: if allowedDisruptions > 1 && !isClusterParallelyUpgraded { err := fmt.Errorf("cluster is not parallely upgraded") *mError = multierr.Append(*mError, err) @@ -11491,7 +11954,7 @@ func IsCloudsnapBackupActiveOnVolume(volName string) (bool, error) { } for _, csBksp := range csBksps { - if csBksp.GetSrcVolumeName() == volName && csBksp.GetStatus() == opsapi.SdkCloudBackupStatusType_SdkCloudBackupStatusTypeActive { + if csBksp.GetSrcVolumeName() == volName && (csBksp.GetStatus() == opsapi.SdkCloudBackupStatusType_SdkCloudBackupStatusTypeActive || csBksp.GetStatus() == opsapi.SdkCloudBackupStatusType_SdkCloudBackupStatusTypeNotStarted) { return true, nil } @@ -11766,3 +12229,696 @@ func SplitStorageDriverUpgradeURL(upgradeURL string) (string, string, error) { pxVersion := pathSegments[len(pathSegments)-1] return endpoint.String(), pxVersion, nil } + +// GetIQNOfNode returns the IQN of the given node in a FA setup +func GetIQNOfNode(n node.Node) (string, error) { + cmd := "cat /etc/iscsi/initiatorname.iscsi" + output, err := runCmdGetOutput(cmd, n) + if err != nil { + return "", err + } + + for _, line := range strings.Split(output, "\n") { + if strings.Contains(line, "InitiatorName") { + return strings.Split(line, "=")[1], nil + } + } + return "", fmt.Errorf("iqn not found") +} + +// GetIQNOfFA gets the IQN of the FA +func GetIQNOfFA(n node.Node, FAclient flasharray.Client) (string, error) { + //Run iscsiadm commands to login to the controllers + networkInterfaces, err := pureutils.GetSpecificInterfaceBasedOnServiceType(&FAclient, "iscsi") + log.FailOnError(err, "Failed to get network interfaces based on service type") + + for _, networkInterface := range networkInterfaces { + ip := networkInterface.Address + log.InfoD("IP address of the iscsi service: %v", ip) + cmd := fmt.Sprintf("iscsiadm -m discovery -t st -p %s", ip) + output, err := runCmdGetOutput(cmd, n) + if err != nil { + return "", err + } + log.InfoD("Output of iscsiadm discovery command: %v", output) + // Split the input text by newline character to get each line + controllers := strings.Split(output, "\n") + // Loop through each line + for _, controller := range controllers { + // Split the line by space + parts := strings.Split(controller, " ") + if len(parts) == 2 { + iqn := parts[1] + return iqn, nil + } + } + + } + return "", fmt.Errorf("IQN not found") + +} + +func RefreshIscsiSession(n node.Node) error { + cmd := "iscsiadm -m session --rescan" + _, err := runCmdGetOutput(cmd, n) + if err != nil { + return err + } + return nil +} + +// GetPVCObjFromVol Returns pvc object from Volume +func GetPVCObjFromVol(vol *volume.Volume) (*v1.PersistentVolumeClaim, error) { + return k8sCore.GetPersistentVolumeClaim(vol.Name, vol.Namespace) +} + +// Enables and Sets trashcan on the cluster +func EnableTrashcanOnCluster(size string) error { + currNode := node.GetStorageDriverNodes()[0] + log.Infof("setting value of trashcan (volume-expiration-minutes) to [%v] ", size) + err := Inst().V.SetClusterOptsWithConfirmation(currNode, + map[string]string{"--volume-expiration-minutes": fmt.Sprintf("%v", size)}) + return err +} + +// WaitForVolumeClean Returns True if Volume in clean state +func WaitForVolumeClean(vol *volume.Volume) error { + t := func() (interface{}, bool, error) { + volDetails, err := Inst().V.InspectVolume(vol.ID) + if err != nil { + return nil, true, fmt.Errorf("error getting volume by using id %s", vol.ID) + } + + for _, v := range volDetails.RuntimeState { + log.InfoD("RuntimeState is in state %s", v.GetRuntimeState()["RuntimeState"]) + if v.GetRuntimeState()["RuntimeState"] == "clean" { + return nil, false, nil + } + } + return nil, true, fmt.Errorf("volume resync hasn't started") + } + _, err := task.DoRetryWithTimeout(t, 30*time.Minute, 60*time.Second) + return err +} + +// GetFADetailsUsed Returns list of FlashArrays used in the cluster +func GetFADetailsUsed() ([]pureutils.FlashArrayEntry, error) { + //get the flash array details + volDriverNamespace, err := Inst().V.GetVolumeDriverNamespace() + if err != nil { + return nil, fmt.Errorf("Failed to get details on FlashArray used in the cluster") + } + + pxPureSecret, err := pureutils.GetPXPureSecret(volDriverNamespace) + if err != nil { + return nil, fmt.Errorf("Unable to get Px Pure Secret") + } + + if len(pxPureSecret.Arrays) > 0 { + return pxPureSecret.Arrays, nil + } + return nil, fmt.Errorf("Failed to list FA Arrays ") +} + +func FlashArrayGetIscsiPorts() (map[string][]string, error) { + flashArrays, err := GetFADetailsUsed() + log.FailOnError(err, "Failed to get flasharray details") + + faWithIscsi := make(map[string][]string) + for _, eachFaInt := range flashArrays { + // Connect to Flash Array using Mgmt IP and API Token + faClient, err := pureutils.PureCreateClientAndConnect(eachFaInt.MgmtEndPoint, eachFaInt.APIToken) + if err != nil { + return nil, err + } + + // Get All Data Interfaces + faData, err := pureutils.GetSpecificInterfaceBasedOnServiceType(faClient, "iscsi") + if err != nil || len(faData) == 0 { + log.Infof("Failed to get data interface on to FA using Mgmt IP [%v]", eachFaInt.MgmtEndPoint) + return nil, err + } + log.InfoD("All FA Details [%v]", faData) + + for _, eachFA := range faData { + log.Infof("Each FA Details [%v]", eachFA) + if eachFA.Enabled && eachFA.Address != "" { + log.Infof("Fa Interface with iscsi IP [%v]", eachFA.Name) + faWithIscsi[eachFaInt.MgmtEndPoint] = append(faWithIscsi[eachFaInt.MgmtEndPoint], eachFA.Name) + } + } + } + return faWithIscsi, nil +} + +// DisableFlashArrayNetworkInterface Disables network interface provided fa Management IP and IFace to Disable on FA +func DisableFlashArrayNetworkInterface(faMgmtIP string, iface string) error { + flashArrays, err := GetFADetailsUsed() + if err != nil { + return err + } + + for _, eachFaInt := range flashArrays { + // Connect to Flash Array using Mgmt IP and API Token + faClient, err := pureutils.PureCreateClientAndConnect(eachFaInt.MgmtEndPoint, eachFaInt.APIToken) + if err != nil { + return err + } + + if eachFaInt.MgmtEndPoint == faMgmtIP { + isEnabled, err := pureutils.IsNetworkInterfaceEnabled(faClient, iface) + log.FailOnError(err, fmt.Sprintf("Interface [%v] is not enabled on FA [%v]", iface, eachFaInt.MgmtEndPoint)) + if err != nil { + log.Errorf("Interface [%v] is not enabled on FA [%v]", iface, eachFaInt.MgmtEndPoint) + return err + } + if !isEnabled { + log.Infof("Network interface is not enabled Ignoring...") + return nil + } + + // Ignore the check here as there is an issue with API's that we are using + _, _ = pureutils.DisableNetworkInterface(faClient, iface) + time.Sleep(10 * time.Second) + + isDisabled, errDis := pureutils.IsNetworkInterfaceEnabled(faClient, iface) + log.Infof("[%v] is Enabled [%v]", iface, isDisabled) + if !isDisabled && errDis == nil { + return nil + } + } + } + return fmt.Errorf("Disabling Interface failed for interface [%v] on Mgmt Ip [%v]", iface, faMgmtIP) +} + +// EnableFlashArrayNetworkInterface Enables network interface on FA Management IP +func EnableFlashArrayNetworkInterface(faMgmtIP string, iface string) error { + flashArrays, err := GetFADetailsUsed() + if err != nil { + return err + } + for _, eachFaInt := range flashArrays { + // Connect to Flash Array using Mgmt IP and API Token + faClient, err := pureutils.PureCreateClientAndConnect(eachFaInt.MgmtEndPoint, eachFaInt.APIToken) + if err != nil { + log.Errorf("Failed to connect to FA using Mgmt IP [%v]", eachFaInt.MgmtEndPoint) + return err + } + + if eachFaInt.MgmtEndPoint == faMgmtIP { + isEnabled, err := pureutils.IsNetworkInterfaceEnabled(faClient, iface) + if err != nil { + log.Errorf(fmt.Sprintf("Interface [%v] is not enabled on FA [%v]", iface, eachFaInt.MgmtEndPoint)) + return err + } + if isEnabled { + log.Infof("Network Interface [%v] is already enabled on cluster [%v]", iface, eachFaInt.MgmtEndPoint) + return nil + } + + // Ignore the check here as there is an issue with API's that we are using + _, _ = pureutils.EnableNetworkInterface(faClient, iface) + isEnabled, errDis := pureutils.IsNetworkInterfaceEnabled(faClient, iface) + if isEnabled && errDis == nil { + return nil + } + } + } + return fmt.Errorf("Enabling Interface failed for interface [%v] on Mgmt Ip [%v]", iface, faMgmtIP) +} + +// GetFBDetailsFromCluster Returns list of FlashBlades used in the cluster +func GetFBDetailsFromCluster() ([]pureutils.FlashBladeEntry, error) { + //get the flash array details + volDriverNamespace, err := Inst().V.GetVolumeDriverNamespace() + if err != nil { + return nil, fmt.Errorf("Failed to get details on FlashBlade used in the cluster") + } + + pxPureSecret, err := pureutils.GetPXPureSecret(volDriverNamespace) + if err != nil { + return nil, fmt.Errorf("Unable to get Px Pure Secret") + } + + if len(pxPureSecret.Blades) > 0 { + return pxPureSecret.Blades, nil + } + return nil, fmt.Errorf("Failed to list available blades from FB ") +} + +// FilterAllPureVolumes returns filtered Pure Volumes from list of Volumes +func FilterAllPureVolumes(volumes []*volume.Volume) ([]volume.Volume, error) { + pureVolumes := []volume.Volume{} + for _, eachVol := range volumes { + isPureVol, err := Inst().V.IsPureVolume(eachVol) + log.FailOnError(err, "validating pureVolume returned err") + if isPureVol { + pureVolumes = append(pureVolumes, *eachVol) + } + } + return pureVolumes, nil +} + +// GetFADetailsFromVolumeName returns FA Struct of FA where the volume is created +func GetFADetailsFromVolumeName(volumeName string) ([]pureutils.FlashArrayEntry, error) { + faEntries := []pureutils.FlashArrayEntry{} + allFAs, err := GetFADetailsUsed() + if err != nil { + return nil, err + } + for _, eachFA := range allFAs { + // Connect to FA Client + log.Info("Connecting to FA [%v]", eachFA.MgmtEndPoint) + faClient, err := pureutils.PureCreateClientAndConnect(eachFA.MgmtEndPoint, eachFA.APIToken) + if err != nil { + log.Errorf("Failed to connect to FA using Mgmt IP [%v]", eachFA.MgmtEndPoint) + return nil, err + } + + // List all the Volumes present in FA + allVolumes, err := pureutils.ListAllTheVolumesFromSpecificFA(faClient) + if err != nil { + return nil, err + } + for _, eachVol := range allVolumes { + if strings.Contains(eachVol.Name, volumeName) { + log.Infof("Volume [%v] present on Host [%v]", eachVol.Name, eachFA.MgmtEndPoint) + faEntries = append(faEntries, eachFA) + } + } + } + return faEntries, nil +} + +// GetVolumeCompleteNameOnFA returns volume Name with Prefix from FA +func GetVolumeCompleteNameOnFA(faClient *flasharray.Client, volName string) (string, error) { + // List all the Volumes present in FA + allVolumes, err := pureutils.ListAllTheVolumesFromSpecificFA(faClient) + if err != nil { + return "", err + } + for _, eachVol := range allVolumes { + if strings.Contains(eachVol.Name, volName) { + return eachVol.Name, nil + } + } + return "", nil +} + +// GetConnectedHostToVolume returns the host details attached to Volume +func GetConnectedHostToVolume(faClient *flasharray.Client, volumeName string) (string, error) { + allHostVolumes, err := pureutils.ListVolumesFromHosts(faClient) + if err != nil { + return "", err + } + for eachHost, volumeDetails := range allHostVolumes { + for _, eachVol := range volumeDetails { + if eachVol.Vol == volumeName { + log.Infof("Volume [%v] is present in Host [%v]", eachVol.Vol, eachHost) + return eachHost, nil + } + } + } + return "", fmt.Errorf("Failed to get details of Host for Volume [%v]", volumeName) +} + +// DeleteVolumeFromFABackend returns true if volume is deleted from backend +func DeleteVolumeFromFABackend(fa pureutils.FlashArrayEntry, volumeName string) (bool, error) { + faClient, err := pureutils.PureCreateClientAndConnect(fa.MgmtEndPoint, fa.APIToken) + if err != nil { + log.Errorf("Failed to connect to FA using Mgmt IP [%v]", fa.MgmtEndPoint) + return false, err + } + + volName, err := GetVolumeCompleteNameOnFA(faClient, volumeName) + if err != nil { + return false, err + } + log.Infof("Name of the Volume is [%v]", volName) + + // Get details of Host from Volume Name + hostName, err := GetConnectedHostToVolume(faClient, volName) + if err != nil { + return false, err + } + log.Infof("Host Name attached to Volume [%v] is [%v]", volName, hostName) + + // Disconnect Host from Volume + connVol, err := pureutils.DisConnectVolumeFromHost(faClient, hostName, volName) + if err != nil { + return false, err + } + log.Infof("Details of Disconnected Volume [%v]", connVol) + + // Verify if volume exists in specific FA + isExists, err := pureutils.IsFAVolumeExists(faClient, volName) + if err != nil { + return false, err + } + if !isExists { + log.Infof("Volume [%v] doesn't exist on the FA Cluster [%v]", volName, fa.MgmtEndPoint) + return true, nil + } + // Delete the Volume from FA Backend + log.Infof("Deleting volume with Name [%v]", volName) + _, err = pureutils.DeleteVolumeOnFABackend(faClient, volName) + if err != nil { + return false, err + } + // Verify if the volume is still exists on FA + // Verify if volume exists in specific FA + isExists, err = pureutils.IsFAVolumeExists(faClient, volName) + if err != nil { + return false, err + } + if isExists { + return false, fmt.Errorf("Volume [%v] still exist in backend", volName) + } + return true, nil + +} + +type MultipathDevices struct { + DevId string + DmID string + Size string + Status string + Type string + Paths []PathInfo +} + +// PathInfo represents information about a path of a multipath device. +type PathInfo struct { + Devnode string + Status string +} + +// Returns all the list of multipath devices present in the cluster nodes +func GetAllMultipathDevicesPresent(n *node.Node) ([]MultipathDevices, error) { + multiPathDevs := []MultipathDevices{} + output, err := runCmdOnce(fmt.Sprintf("multipath -ll"), *n) + log.Infof("%v", err) + if err != nil { + return nil, err + } + log.Infof("Output Details before parsing [%v]", output) + + devDetailsPattern := regexp.MustCompile(`^(.*)\s+(dm-.*)\s+(.*)\,.*`) + sizeMatchPattern := regexp.MustCompile(`.*size=([0-9]+G)\s+.*`) + statusMatchPatern := regexp.MustCompile(`.*status\=(\w+)`) + sdMatchPattern := regexp.MustCompile(`.*\s+(\d+:\d+:\d+:\d+)+\s+(sd\w+)\s+([0-9:]+)\s+(.*)`) + + // Create a Reader from the string + reader := strings.Split(output, "\n") + log.Infof("Output Details [%v]", reader) + + initPatternFound := false + multipathDevices := MultipathDevices{} + for i, eachLine := range reader { + matched := devDetailsPattern.FindStringSubmatch(eachLine) + if len(matched) > 1 { + if initPatternFound { + multiPathDevs = append(multiPathDevs, multipathDevices) + } + multipathDevices = MultipathDevices{} + multipathDevices.DevId = matched[1] + multipathDevices.DmID = matched[2] + multipathDevices.Type = matched[3] + initPatternFound = true + } + + matched = sizeMatchPattern.FindStringSubmatch(eachLine) + if len(matched) > 1 { + multipathDevices.Size = matched[1] + } + + matched = statusMatchPatern.FindStringSubmatch(eachLine) + if len(matched) > 1 { + multipathDevices.Status = matched[1] + } + + matched = sdMatchPattern.FindStringSubmatch(eachLine) + if len(matched) > 1 { + paths := PathInfo{} + paths.Devnode = matched[2] + paths.Status = matched[4] + multipathDevices.Paths = append(multipathDevices.Paths, paths) + } + // Validate Last Line + if i == len(reader)-1 { + multiPathDevs = append(multiPathDevs, multipathDevices) + } + } + + return multiPathDevs, nil +} + +// GetMultipathDeviceIDsOnNode returns List of all Multipath Devices on Node +func GetMultipathDeviceIDsOnNode(n *node.Node) ([]string, error) { + multiPathDev := []string{} + multiPathDevices, err := GetAllMultipathDevicesPresent(n) + if err != nil { + return nil, err + } + for _, eachMultipathDev := range multiPathDevices { + multiPathDev = append(multiPathDev, eachMultipathDev.DevId) + } + return multiPathDev, nil +} + +// CreateFlashStorageClass Creates storage class for Purity Backend +// ReclaimPolicy can be v1.PersistentVolumeReclaimDelete, v1.PersistentVolumeReclaimRetain, v1.PersistentVolumeReclaimRecycle +// volumeBinding storageapi.VolumeBindingImmediate, storageapi.VolumeBindingWaitForFirstConsumer +func CreateFlashStorageClass(scName string, + scType string, + ReclaimPolicy v1.PersistentVolumeReclaimPolicy, + params map[string]string, + MountOptions []string, + AllowVolumeExpansion *bool, + VolumeBinding storageapi.VolumeBindingMode, + AllowedTopologies map[string][]string) error { + + var reclaimPolicy v1.PersistentVolumeReclaimPolicy + param := make(map[string]string) + for key, value := range params { + param[key] = value + } + // add pure backend type + param["backend"] = scType + param["repl"] = "1" + + v1obj := metav1.ObjectMeta{ + Name: scName, + } + + if VolumeBinding != storageapi.VolumeBindingImmediate && VolumeBinding != storageapi.VolumeBindingWaitForFirstConsumer { + return fmt.Errorf("Unsupported binding mode specified , please use storageapi.VolumeBindingImmediate or storageapi.VolumeBindingWaitForFirstConsumer") + } + + // Declare Reclaim Policies + switch ReclaimPolicy { + case v1.PersistentVolumeReclaimDelete: + reclaimPolicy = v1.PersistentVolumeReclaimDelete + case v1.PersistentVolumeReclaimRetain: + reclaimPolicy = v1.PersistentVolumeReclaimRetain + case v1.PersistentVolumeReclaimRecycle: + reclaimPolicy = v1.PersistentVolumeReclaimRecycle + } + + var allowedTopologies []v1.TopologySelectorTerm = nil + if AllowedTopologies != nil { + topologySelector := v1.TopologySelectorTerm{} + topologyList := []v1.TopologySelectorLabelRequirement{} + for key, value := range AllowedTopologies { + topology := v1.TopologySelectorLabelRequirement{} + topology.Key = key + topology.Values = value + topologyList = append(topologyList, topology) + } + topologySelector.MatchLabelExpressions = topologyList + allowedTopologies = append(allowedTopologies, topologySelector) + } + + scObj := storageapi.StorageClass{ + ObjectMeta: v1obj, + Provisioner: k8s.CsiProvisioner, + Parameters: param, + MountOptions: MountOptions, + ReclaimPolicy: &reclaimPolicy, + AllowVolumeExpansion: AllowVolumeExpansion, + VolumeBindingMode: &VolumeBinding, + AllowedTopologies: allowedTopologies, + } + + k8storage := schedstorage.Instance() + _, err := k8storage.CreateStorageClass(&scObj) + return err +} + +// CreateFlashPVCOnCluster Creates PVC on the Cluster +func CreateFlashPVCOnCluster(pvcName string, scName string, nameSpace string, sizeGb string) error { + log.InfoD("creating PVC [%s] in namespace [%s]", pvcName, nameSpace) + pvcObj := &v1.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: pvcName, + Namespace: nameSpace, + }, + Spec: v1.PersistentVolumeClaimSpec{ + AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce}, + StorageClassName: &scName, + Resources: v1.ResourceRequirements{ + Requests: v1.ResourceList{ + v1.ResourceStorage: resource.MustParse(sizeGb), + }, + }, + }, + } + _, err := core.Instance().CreatePersistentVolumeClaim(pvcObj) + return err +} + +// GetAllPVCFromNs returns all PVC's Created on specific NameSpace +func GetAllPVCFromNs(nsName string, labelSelector map[string]string) ([]v1.PersistentVolumeClaim, error) { + pvcList, err := core.Instance().GetPersistentVolumeClaims(nsName, labelSelector) + if err != nil { + return nil, err + } + return pvcList.Items, nil +} + +// Returns details about cloud drives present in the cluster +type CloudConfig struct { + Type string `json:"Type"` + Size int `json:"Size"` + ID string `json:"ID"` + PoolID string `json:"PoolID"` + Path string `json:"Path"` + Iops int `json:"Iops"` + Vpus int `json:"Vpus"` + PXType string `json:"PXType"` + State string `json:"State"` + Labels map[string]string `json:"labels"` + AttachOptions interface{} `json:"AttachOptions"` + Provisioner string `json:"Provisioner"` + EncryptionKeyInfo string `json:"EncryptionKeyInfo"` +} + +type CloudData struct { + Configs map[string]CloudConfig `json:"Configs"` + NodeID string `json:"NodeID"` + ReservedInstanceID string `json:"ReservedInstanceID"` + SchedulerNodeName string `json:"SchedulerNodeName"` + NodeIndex int `json:"NodeIndex"` + CreateTimestamp time.Time `json:"CreateTimestamp"` + InstanceID string `json:"InstanceID"` + Zone string `json:"Zone"` + State string `json:"State"` + Labels map[string]string `json:"labels"` +} + +// GetCloudDriveDetailsOnCluster returns list of cloud drives on the cluster +func GetCloudDriveList() (*map[string]CloudData, error) { + var data map[string]CloudData + allNodes := node.GetStorageNodes() + for _, eachNode := range allNodes { + + stNode, err := Inst().V.GetDriverNode(&eachNode) + if err != nil { + return nil, err + } + if stNode.Status != opsapi.Status_STATUS_OK { + continue + } + command := "pxctl cd list -j" + output, err := runCmdOnce(command, eachNode) + log.Infof("%v", err) + if err != nil { + return nil, err + } + + err = json.Unmarshal([]byte(output), &data) + if err != nil { + fmt.Println("Error:", err) + return nil, err + } + break + } + log.Infof("%v", &data) + return &data, nil + +} + +// GetCloudDrivesOnSpecificNode Returns details of all Cloud drives from specific Node +func GetCloudDrivesOnSpecificNode(n *node.Node) (*CloudData, error) { + allCloudDrives, err := GetCloudDriveList() + if err != nil { + return nil, err + } + for nodeId, cList := range *allCloudDrives { + if nodeId == n.Id { + return &cList, nil + } + } + return nil, fmt.Errorf("Failed to get Cloud Drive on Specific Node [%v]", n.Name) +} + +// IsPureCluster returns True if backend Type is Pure +func IsPureCluster() bool { + if stc, err := Inst().V.GetDriver(); err == nil { + if oputil.IsPure(stc) { + logrus.Infof("Pure installation with PX operator detected.") + return true + } + } + return false +} + +// IsPureCloudProvider Returns true if cloud Provider is Pure +func IsPureCloudProvider() bool { + if stc, err := Inst().V.GetDriver(); err == nil { + if oputil.GetCloudProvider(stc) == "pure" { + return true + } + } + return false +} + +// GetDrivesFromSpecificPoolOnNode returns List of Drives On Specific Node +func GetDrivesFromSpecificPoolOnNode(n *node.Node, poolId string) ([]string, error) { + allPools, err := Inst().V.GetPoolDrives(n) + if err != nil { + return nil, err + } + log.Infof("All Pool IDs [%v]", allPools) + if val, ok := allPools[poolId]; ok { + return val, nil + } + return nil, fmt.Errorf("Failed to get details of Drive on Pool [%v]", poolId) +} + +// GetMultipathDeviceOnPool Returns list of multipath devices on Pool +func GetMultipathDeviceOnPool(n *node.Node) (map[string][]string, error) { + multipathMap := make(map[string][]string) + + // Get All Multipath Devices on the perticular Node + allMultipathDev, err := GetMultipathDeviceIDsOnNode(n) + if err != nil { + return nil, err + } + + allPools, err := Inst().V.GetPoolDrives(n) + if err != nil { + return nil, err + } + + for eachPoolId, eachDev := range allPools { + for _, dev := range eachDev { + for _, multiDev := range allMultipathDev { + if strings.Contains(dev, multiDev) { + multipathMap[eachPoolId] = append(multipathMap[eachPoolId], multiDev) + } + } + } + } + return multipathMap, nil +} \ No newline at end of file diff --git a/tests/kubevirt_helper.go b/tests/kubevirt_helper.go index c350e1ff2..989cde0c9 100644 --- a/tests/kubevirt_helper.go +++ b/tests/kubevirt_helper.go @@ -39,6 +39,8 @@ var ( k8sKubevirt = kubevirt.Instance() importerPodCompletionTimeout = 30 * time.Minute importerPodRetryInterval = 20 * time.Second + defaultMigrationTimeout = 30 * time.Minute + defaultMigrationRetryInterval = 30 * time.Second ) // AddDisksToKubevirtVM is a function which takes number of disks to add and adds them to the kubevirt VMs passed (Please provide size in Gi) @@ -233,7 +235,7 @@ func GetStorageClassOfVmPVC(vm *scheduler.Context) (string, error) { // StartAndWaitForVMIMigration starts the VM migration and waits for the VM to be in running state in the new node func StartAndWaitForVMIMigration(virtualMachineCtx *scheduler.Context, ctx context1.Context) error { - + log.InfoD("Initiating VM migration for VM [%s] in namespace [%s]", virtualMachineCtx.App.Key, virtualMachineCtx.App.NameSpace) vms, err := GetAllVMsFromScheduledContexts([]*scheduler.Context{virtualMachineCtx}) if err != nil { return err @@ -275,6 +277,7 @@ func StartAndWaitForVMIMigration(virtualMachineCtx *scheduler.Context, ctx conte t := func() (interface{}, bool, error) { migr, err = kubevirtdy.Instance().GetVirtualMachineInstanceMigration(ctx, vmiNamespace, migration.Name) if err != nil { + log.InfoD("Error: %v", err) return "", false, fmt.Errorf("failed to get migration for VM [%s] in namespace [%s]", vmiName, vmiNamespace) } if !(migr.Phase == "Succeeded") { @@ -297,7 +300,7 @@ func StartAndWaitForVMIMigration(virtualMachineCtx *scheduler.Context, ctx conte log.InfoD("VM pod live migrated to node: [%s]", nodeNameAfterMigration) return "", false, nil } - _, err = task.DoRetryWithTimeout(t, defaultVmMountCheckTimeout, defaultVmMountCheckRetryInterval) + _, err = task.DoRetryWithTimeout(t, defaultMigrationTimeout, defaultMigrationRetryInterval) if err != nil { return err } @@ -762,3 +765,75 @@ func DeployVMTemplatesAndValidate() error { _, err = task.DoRetryWithTimeout(waitForCompletedAnnotations, importerPodCompletionTimeout, importerPodRetryInterval) return err } + +// GetReplicaNodesOfVM returns a list of nodes where the replica of the volumes are present +func GetReplicaNodesOfVM(virtualMachineCtx *scheduler.Context) ([]string, error) { + vols, err := Inst().S.GetVolumes(virtualMachineCtx) + if err != nil { + return nil, err + } + // Get replica nodes where the volumes are present + replicaNodes, err := getReplicaNodes(vols[0]) + if err != nil { + return nil, err + } + replicaNodesName := []string{} + for _, replicaNode := range replicaNodes { + id, err := node.GetNodeDetailsByNodeID(replicaNode) + log.FailOnError(err, "Failed to get node details by node id") + replicaNodesName = append(replicaNodesName, id.Name) + } + + return replicaNodesName, nil +} + +func GetNonReplicaNodesOfVM(virtualMachineCtx *scheduler.Context) ([]string, error) { + vols, err := Inst().S.GetVolumes(virtualMachineCtx) + if err != nil { + return nil, err + } + // Get replica nodes where the volumes are present + replicaNodes, err := getReplicaNodes(vols[0]) + if err != nil { + return nil, err + } + for _, replicaNode := range replicaNodes { + log.Infof("Replica node: %s", replicaNode) + } + + replicaNodesName := []string{} + for _, replicaNode := range replicaNodes { + id, err := node.GetNodeDetailsByNodeID(replicaNode) + log.FailOnError(err, "Failed to get node details by node id") + replicaNodesName = append(replicaNodesName, id.Name) + } + + // Get all nodes in the cluster + allNodes, err := GetStorageNodes() + if err != nil { + return nil, err + } + for _, node := range allNodes { + log.Infof("All nodes: %s", node.Name) + } + + // Get non-replica nodes + nonReplicaNodes := []string{} + + for _, node := range allNodes { + flag := false + for _, replicaNode := range replicaNodesName { + if node.Name == replicaNode { + flag = true + } + } + if !flag { + nonReplicaNodes = append(nonReplicaNodes, node.Name) + } + } + for _, nonReplicaNode := range nonReplicaNodes { + log.Infof("Non-replica node: %s", nonReplicaNode) + } + + return nonReplicaNodes, nil +} diff --git a/tests/longevity/longevity_helper.go b/tests/longevity/longevity_helper.go index 4cefb152b..846ae2618 100644 --- a/tests/longevity/longevity_helper.go +++ b/tests/longevity/longevity_helper.go @@ -209,8 +209,10 @@ func populateDisruptiveTriggers() { RebootManyNodes: true, RestartKvdbVolDriver: true, NodeDecommission: true, + DetachDrives: true, CsiSnapShot: false, CsiSnapRestore: false, + DeleteCloudsnaps: false, KVDBFailover: true, HAIncreaseAndReboot: true, AddDiskAndReboot: true, @@ -218,6 +220,7 @@ func populateDisruptiveTriggers() { VolumeCreatePxRestart: true, OCPStorageNodeRecycle: true, CrashPXDaemon: true, + PowerOffAllVMs: true, } } @@ -560,10 +563,12 @@ func populateIntervals() { triggerInterval[UpgradeVolumeDriver] = make(map[int]time.Duration) triggerInterval[UpgradeVolumeDriverFromCatalog] = make(map[int]time.Duration) triggerInterval[UpgradeCluster] = make(map[int]time.Duration) + triggerInterval[PowerOffAllVMs] = make(map[int]time.Duration) triggerInterval[AppTasksDown] = make(map[int]time.Duration) triggerInterval[AutoFsTrim] = make(map[int]time.Duration) triggerInterval[UpdateVolume] = make(map[int]time.Duration) triggerInterval[UpdateIOProfile] = make(map[int]time.Duration) + triggerInterval[DetachDrives] = make(map[int]time.Duration) triggerInterval[RestartManyVolDriver] = make(map[int]time.Duration) triggerInterval[RebootManyNodes] = make(map[int]time.Duration) triggerInterval[NodeDecommission] = make(map[int]time.Duration) @@ -618,9 +623,10 @@ func populateIntervals() { triggerInterval[VolumeDriverDownVCluster] = make(map[int]time.Duration) triggerInterval[SetDiscardMounts] = make(map[int]time.Duration) triggerInterval[ResetDiscardMounts] = make(map[int]time.Duration) + triggerInterval[ScaleFADAVolumeAttach] = map[int]time.Duration{} + triggerInterval[DeleteCloudsnaps] = make(map[int]time.Duration) baseInterval := 10 * time.Minute - triggerInterval[BackupScaleMongo][10] = 1 * baseInterval triggerInterval[BackupScaleMongo][9] = 2 * baseInterval triggerInterval[BackupScaleMongo][8] = 3 * baseInterval @@ -937,7 +943,6 @@ func populateIntervals() { triggerInterval[StorkAppBkpPoolResize][3] = 21 * baseInterval triggerInterval[StorkAppBkpPoolResize][2] = 24 * baseInterval triggerInterval[StorkAppBkpPoolResize][1] = 27 * baseInterval - baseInterval = 60 * time.Minute triggerInterval[AppTasksDown][10] = 1 * baseInterval @@ -995,6 +1000,17 @@ func populateIntervals() { triggerInterval[CrashPXDaemon][2] = 24 * baseInterval triggerInterval[CrashPXDaemon][1] = 27 * baseInterval + triggerInterval[PowerOffAllVMs][10] = 1 * baseInterval + triggerInterval[PowerOffAllVMs][9] = 3 * baseInterval + triggerInterval[PowerOffAllVMs][8] = 6 * baseInterval + triggerInterval[PowerOffAllVMs][7] = 9 * baseInterval + triggerInterval[PowerOffAllVMs][6] = 12 * baseInterval + triggerInterval[PowerOffAllVMs][5] = 15 * baseInterval + triggerInterval[PowerOffAllVMs][4] = 18 * baseInterval + triggerInterval[PowerOffAllVMs][3] = 21 * baseInterval + triggerInterval[PowerOffAllVMs][2] = 24 * baseInterval + triggerInterval[PowerOffAllVMs][1] = 27 * baseInterval + triggerInterval[NodeMaintenanceCycle][10] = 1 * baseInterval triggerInterval[NodeMaintenanceCycle][9] = 3 * baseInterval triggerInterval[NodeMaintenanceCycle][8] = 6 * baseInterval @@ -1189,6 +1205,17 @@ func populateIntervals() { triggerInterval[CloudSnapShotRestore][2] = 24 * baseInterval triggerInterval[CloudSnapShotRestore][1] = 27 * baseInterval + triggerInterval[DeleteCloudsnaps][10] = 1 * baseInterval + triggerInterval[DeleteCloudsnaps][9] = 3 * baseInterval + triggerInterval[DeleteCloudsnaps][8] = 6 * baseInterval + triggerInterval[DeleteCloudsnaps][7] = 9 * baseInterval + triggerInterval[DeleteCloudsnaps][6] = 12 * baseInterval + triggerInterval[DeleteCloudsnaps][5] = 15 * baseInterval // Default global chaos level, 3 hrs + triggerInterval[DeleteCloudsnaps][4] = 18 * baseInterval + triggerInterval[DeleteCloudsnaps][3] = 21 * baseInterval + triggerInterval[DeleteCloudsnaps][2] = 24 * baseInterval + triggerInterval[DeleteCloudsnaps][1] = 27 * baseInterval + triggerInterval[LocalSnapShot][10] = 1 * baseInterval triggerInterval[LocalSnapShot][9] = 3 * baseInterval triggerInterval[LocalSnapShot][8] = 6 * baseInterval @@ -1321,6 +1348,17 @@ func populateIntervals() { triggerInterval[UpdateIOProfile][2] = 24 * baseInterval triggerInterval[UpdateIOProfile][1] = 27 * baseInterval + triggerInterval[DetachDrives][10] = 1 * baseInterval + triggerInterval[DetachDrives][9] = 3 * baseInterval + triggerInterval[DetachDrives][8] = 6 * baseInterval + triggerInterval[DetachDrives][7] = 9 * baseInterval + triggerInterval[DetachDrives][6] = 12 * baseInterval + triggerInterval[DetachDrives][5] = 15 * baseInterval + triggerInterval[DetachDrives][4] = 18 * baseInterval + triggerInterval[DetachDrives][3] = 21 * baseInterval + triggerInterval[DetachDrives][2] = 24 * baseInterval + triggerInterval[DetachDrives][1] = 27 * baseInterval + triggerInterval[NodeDecommission][10] = 1 * baseInterval triggerInterval[NodeDecommission][9] = 3 * baseInterval triggerInterval[NodeDecommission][8] = 6 * baseInterval @@ -1617,6 +1655,17 @@ func populateIntervals() { triggerInterval[OCPStorageNodeRecycle][2] = 24 * baseInterval triggerInterval[OCPStorageNodeRecycle][1] = 30 * baseInterval + triggerInterval[ScaleFADAVolumeAttach][10] = 1 * baseInterval + triggerInterval[ScaleFADAVolumeAttach][9] = 3 * baseInterval + triggerInterval[ScaleFADAVolumeAttach][8] = 6 * baseInterval + triggerInterval[ScaleFADAVolumeAttach][7] = 9 * baseInterval + triggerInterval[ScaleFADAVolumeAttach][6] = 12 * baseInterval + triggerInterval[ScaleFADAVolumeAttach][5] = 15 * baseInterval + triggerInterval[ScaleFADAVolumeAttach][4] = 18 * baseInterval + triggerInterval[ScaleFADAVolumeAttach][3] = 21 * baseInterval + triggerInterval[ScaleFADAVolumeAttach][2] = 24 * baseInterval + triggerInterval[ScaleFADAVolumeAttach][1] = 30 * baseInterval + // Chaos Level of 0 means disable test trigger triggerInterval[DeployApps][0] = 0 triggerInterval[RebootNode][0] = 0 @@ -1687,14 +1736,17 @@ func populateIntervals() { triggerInterval[AutopilotRebalance][0] = 0 triggerInterval[VolumeCreatePxRestart][0] = 0 triggerInterval[CloudSnapShotRestore][0] = 0 + triggerInterval[DeleteCloudsnaps][0] = 0 triggerInterval[LocalSnapShotRestore][0] = 0 triggerInterval[UpdateIOProfile][0] = 0 triggerInterval[AggrVolDepReplResizeOps][0] = 0 triggerInterval[UpdateIOProfile][0] = 0 + triggerInterval[DetachDrives][0] = 0 triggerInterval[AddStorageNode][0] = 0 triggerInterval[AddStoragelessNode][0] = 0 triggerInterval[OCPStorageNodeRecycle][0] = 0 triggerInterval[NodeDecommission][0] = 0 + triggerInterval[PowerOffAllVMs][0] = 0 triggerInterval[HAIncreaseAndRestartPX][0] = 0 triggerInterval[HAIncreaseAndCrashPX][0] = 0 triggerInterval[CrashPXDaemon][0] = 0 @@ -1705,6 +1757,7 @@ func populateIntervals() { triggerInterval[ReallocateSharedMount][0] = 0 triggerInterval[SetDiscardMounts][0] = 0 triggerInterval[ResetDiscardMounts][0] = 0 + triggerInterval[ScaleFADAVolumeAttach][0] = 0 } func isTriggerEnabled(triggerType string) (time.Duration, bool) { diff --git a/tests/longevity/longevity_test.go b/tests/longevity/longevity_test.go index 473ca42d4..6e2fec3b3 100644 --- a/tests/longevity/longevity_test.go +++ b/tests/longevity/longevity_test.go @@ -2,7 +2,6 @@ package tests import ( "fmt" - "github.com/portworx/torpedo/drivers/scheduler/iks" "math" "os" "strconv" @@ -10,6 +9,8 @@ import ( "sync" "time" + "github.com/portworx/torpedo/drivers/scheduler/iks" + "github.com/portworx/torpedo/pkg/log" . "github.com/onsi/ginkgo/v2" @@ -29,18 +30,17 @@ var _ = Describe("{Longevity}", func() { var populateDone bool triggerEventsChan := make(chan *EventRecord, 100) triggerFunctions = map[string]func(*[]*scheduler.Context, *chan *EventRecord){ - DeployApps: TriggerDeployNewApps, - RebootNode: TriggerRebootNodes, - ValidatePdsApps: TriggerValidatePdsApps, - CrashNode: TriggerCrashNodes, - CrashPXDaemon: TriggerCrashPXDaemon, - RestartVolDriver: TriggerRestartVolDriver, - CrashVolDriver: TriggerCrashVolDriver, - HAIncrease: TriggerHAIncrease, - HADecrease: TriggerHADecrease, - VolumeClone: TriggerVolumeClone, - VolumeResize: TriggerVolumeResize, - //EmailReporter: TriggerEmailReporter, + DeployApps: TriggerDeployNewApps, + RebootNode: TriggerRebootNodes, + ValidatePdsApps: TriggerValidatePdsApps, + CrashNode: TriggerCrashNodes, + CrashPXDaemon: TriggerCrashPXDaemon, + RestartVolDriver: TriggerRestartVolDriver, + CrashVolDriver: TriggerCrashVolDriver, + HAIncrease: TriggerHAIncrease, + HADecrease: TriggerHADecrease, + VolumeClone: TriggerVolumeClone, + VolumeResize: TriggerVolumeResize, AppTaskDown: TriggerAppTaskDown, AppTasksDown: TriggerAppTasksDown, AddDrive: TriggerAddDrive, @@ -74,6 +74,7 @@ var _ = Describe("{Longevity}", func() { MongoAsyncDR: TriggerMongoAsyncDR, AsyncDRVolumeOnly: TriggerAsyncDRVolumeOnly, AutoFsTrimAsyncDR: TriggerAutoFsTrimAsyncDR, + DetachDrives: TriggerDetachDrives, IopsBwAsyncDR: TriggerIopsBwAsyncDR, StorkApplicationBackup: TriggerStorkApplicationBackup, StorkAppBkpVolResize: TriggerStorkAppBkpVolResize, @@ -85,8 +86,8 @@ var _ = Describe("{Longevity}", func() { AddDiskAndReboot: TriggerPoolAddDiskAndReboot, ResizeDiskAndReboot: TriggerPoolResizeDiskAndReboot, AutopilotRebalance: TriggerAutopilotPoolRebalance, - VolumeCreatePxRestart: TriggerVolumeCreatePXRestart, DeleteOldNamespaces: TriggerDeleteOldNamespaces, + DeleteCloudsnaps: TriggerDeleteCloudsnaps, MetroDRMigrationSchedule: TriggerMetroDRMigrationSchedule, CloudSnapShotRestore: TriggerCloudSnapshotRestore, LocalSnapShotRestore: TriggerLocalSnapshotRestore, @@ -105,7 +106,9 @@ var _ = Describe("{Longevity}", func() { CreateAndRunMultipleFioOnVcluster: TriggerCreateAndRunMultipleFioOnVcluster, VolumeDriverDownVCluster: TriggerVolumeDriverDownVCluster, SetDiscardMounts: TriggerSetDiscardMounts, + PowerOffAllVMs: TriggerPowerOffAllVMs, ResetDiscardMounts: TriggerResetDiscardMounts, + ScaleFADAVolumeAttach: TriggerScaleFADAVolumeAttach, } //Creating a distinct trigger to make sure email triggers at regular intervals emailTriggerFunction = map[string]func(){ diff --git a/tests/testTriggers.go b/tests/testTriggers.go index cae259bf9..32aaa668c 100644 --- a/tests/testTriggers.go +++ b/tests/testTriggers.go @@ -4,13 +4,6 @@ import ( "bytes" "container/ring" "fmt" - "github.com/devans10/pugo/flasharray" - oputil "github.com/libopenstorage/operator/pkg/util/test" - "github.com/portworx/torpedo/drivers/scheduler/aks" - "github.com/portworx/torpedo/drivers/scheduler/eks" - "github.com/portworx/torpedo/drivers/scheduler/gke" - "github.com/portworx/torpedo/drivers/scheduler/iks" - "github.com/portworx/torpedo/pkg/osutils" "math" "math/rand" "net/url" @@ -25,15 +18,27 @@ import ( "text/template" "time" + + "github.com/devans10/pugo/flasharray" + oputil "github.com/libopenstorage/operator/pkg/util/test" + "github.com/portworx/torpedo/drivers/scheduler/aks" + "github.com/portworx/torpedo/drivers/scheduler/eks" + "github.com/portworx/torpedo/drivers/scheduler/gke" + "github.com/portworx/torpedo/drivers/scheduler/iks" + "github.com/portworx/torpedo/pkg/osutils" + "golang.org/x/exp/slices" + volsnapv1 "github.com/kubernetes-csi/external-snapshotter/client/v6/apis/volumesnapshot/v1" snapv1 "github.com/kubernetes-incubator/external-storage/snapshot/pkg/apis/crd/v1" apios "github.com/libopenstorage/openstorage/api" opsapi "github.com/libopenstorage/openstorage/api" + operatorcorev1 "github.com/libopenstorage/operator/pkg/apis/core/v1" storkapi "github.com/libopenstorage/stork/pkg/apis/stork/v1alpha1" storkv1 "github.com/libopenstorage/stork/pkg/apis/stork/v1alpha1" "github.com/onsi/ginkgo/v2" "github.com/pborman/uuid" api "github.com/portworx/px-backup-api/pkg/apis/v1" + "github.com/portworx/sched-ops/k8s/apps" "github.com/portworx/sched-ops/k8s/core" "github.com/portworx/sched-ops/k8s/operator" storage "github.com/portworx/sched-ops/k8s/storage" @@ -41,10 +46,11 @@ import ( "github.com/portworx/sched-ops/task" "gopkg.in/natefinch/lumberjack.v2" appsapi "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1" storageapi "k8s.io/api/storage/v1" + "k8s.io/apimachinery/pkg/api/resource" meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/portworx/torpedo/drivers/backup" "github.com/portworx/torpedo/drivers/monitor/prometheus" @@ -150,6 +156,14 @@ const ( REBOOT ErrorInjection = "reboot" ) +const ( + deploymentCount = 250 + deploymentNamePrefix = "fada-scale-dep" + pvcNamePrefix = "fada-scale-pvc" + fadaNamespacePrefix = "fada-namespace" + podAttachTimeout = 15 * time.Minute +) + // TODO Need to add for AutoJournal //var IOProfileChange = [4]apios.IoProfile{apios.IoProfile_IO_PROFILE_NONE, apios.IoProfile_IO_PROFILE_AUTO_JOURNAL, apios.IoProfile_IO_PROFILE_AUTO, apios.IoProfile_IO_PROFILE_DB_REMOTE} @@ -504,8 +518,12 @@ const ( // UpdateVolume provides option to update volume with properties like iopriority. UpdateVolume = "updateVolume" UpdateIOProfile = "updateIOProfile" + DetachDrives = "detachDrives" + PowerOffAllVMs = "powerOffAllVMs" // NodeDecommission decommission random node in the PX cluster NodeDecommission = "nodeDecomm" + // Delelete cloudsnaps + DeleteCloudsnaps = "deleteCloudsnaps" //NodeRejoin rejoins the decommissioned node into the PX cluster NodeRejoin = "nodeRejoin" // RelaxedReclaim enables RelaxedReclaim in PX cluster @@ -633,6 +651,9 @@ const ( // ResetDiscardMounts Sets and resets discard cluster wide options on the cluster ResetDiscardMounts = "ResetDiscardMounts" + + // ScaleFADAVolumeAttach create and attach FADA volumes at scale + ScaleFADAVolumeAttach = "ScaleFADAVolumeAttach" ) // TriggerCoreChecker checks if any cores got generated @@ -813,6 +834,131 @@ func TriggerDeployNewApps(contexts *[]*scheduler.Context, recordChan *chan *Even }) } +// TriggerDetachDrives Detach all vsphere cloud drives, verify storage node will be recoevred after node maintenance cycle. +func TriggerDetachDrives(contexts *[]*scheduler.Context, recordChan *chan *EventRecord) { + defer ginkgo.GinkgoRecover() + defer endLongevityTest() + startLongevityTest(DetachDrives) + event := &EventRecord{ + Event: Event{ + ID: GenerateUUID(), + Type: DetachDrives, + }, + Start: time.Now().Format(time.RFC1123), + Outcome: []error{}, + } + defer func() { + event.End = time.Now().Format(time.RFC1123) + *recordChan <- event + }() + setMetrics(*event) + stepLog := "Detach cloud drives from Storage node" + Step(stepLog, func() { + var err error + var stc *operatorcorev1.StorageCluster + log.Infof(stepLog) + Step(stepLog, + func() { + log.Infof(stepLog) + getSTC := func() (interface{}, bool, error) { + namespace, err := Inst().S.GetPortworxNamespace() + if err != nil { + return nil, false, fmt.Errorf("Portworx namespace %s is not found: err %v", namespace, err) + } + pxOperator := operator.Instance() + stcList, err := pxOperator.ListStorageClusters(namespace) + if err != nil { + return nil, false, fmt.Errorf("Storage cluster list are not available: err %v", err) + } + log.Infof("Stc list %v ", stcList) + stc, err = pxOperator.GetStorageCluster(stcList.Items[0].Name, stcList.Items[0].Namespace) + if err != nil { + return nil, false, fmt.Errorf("Storage cluster is not available: err %v", err) + } + return nil, false, nil + } + _, err = task.DoRetryWithTimeout(getSTC, 3*time.Minute, 1*time.Minute) + UpdateOutcome(event, err) + var nodeId string + storageNodes := node.GetStorageNodes() + nodeId = storageNodes[0].VolDriverNodeID + err = Inst().N.DetachDrivesFromVM(stc, storageNodes[0].Name) + UpdateOutcome(event, err) + time.Sleep(time.Duration(1 * time.Minute)) + statusErr := Inst().V.WaitDriverUpOnNode(storageNodes[0], 10*time.Minute) + if statusErr != nil { + if strings.Contains(statusErr.Error(), apios.Status_STATUS_STORAGE_DOWN.String()) { + log.Infof("Node has gone to Storage Down state after detach %v: Node %s", statusErr, storageNodes[0].Name) + } else { + UpdateOutcome(event, statusErr) + } + } + storageNode, err := Inst().V.GetDriverNode(&storageNodes[0]) + UpdateOutcome(event, err) + if storageNode.Status.String() != apios.Status_STATUS_STORAGE_DOWN.String() { + UpdateOutcome(event, fmt.Errorf("Node %s: Expected: %v Actual: %v", storageNode.SchedulerNodeName, + apios.Status_STATUS_STORAGE_DOWN, storageNode.Status)) + } + log.Infof("Status of the storage node %s ,%v ", storageNode.SchedulerNodeName, storageNode.Status) + statusErr = Inst().V.EnterMaintenance(storageNodes[0]) + UpdateOutcome(event, statusErr) + status, _ := Inst().V.GetNodeStatus(storageNodes[0]) + log.Infof("Status when the storage node entered maintenance mode %s , ", status.String()) + if status.String() != apios.Status_STATUS_MAINTENANCE.String() { + UpdateOutcome(event, fmt.Errorf("Node %s: Expected: %v Actual: %v", storageNodes[0].Name, + apios.Status_STATUS_MAINTENANCE, status)) + } + statusErr = Inst().V.ExitMaintenance(storageNodes[0]) + UpdateOutcome(event, statusErr) + status, _ = Inst().V.GetNodeStatus(storageNodes[0]) + log.Infof("Node Status after exit maintenance mode %v , %s", status, storageNodes[0].Name) + if status.String() != apios.Status_STATUS_OK.String() { + UpdateOutcome(event, fmt.Errorf("Node %s: Expected: %v Actual: %v", storageNodes[0].Name, + apios.Status_STATUS_MAINTENANCE, status)) + } + err = Inst().V.RefreshDriverEndpoints() + UpdateOutcome(event, err) + //There are chances that storageless node can convert storage node by attaching these drives. Hence making sure + //This node id is up. + var selectedStorageNode *node.Node + storageNodes = node.GetStorageNodes() + for _, nodeInfo := range storageNodes { + if nodeInfo.VolDriverNodeID == nodeId { + selectedStorageNode = &nodeInfo + log.Infof("Node which has the nodeID %v , %s", status, (*selectedStorageNode).Name) + break + } + } + if selectedStorageNode != nil { + status, err = Inst().V.GetNodeStatus(*selectedStorageNode) + if err != nil { + UpdateOutcome(event, err) + } else { + log.Infof("Node Status %v node: %s", status, (*selectedStorageNode).SchedulerNodeName) + if status.String() != apios.Status_STATUS_OK.String() { + UpdateOutcome(event, fmt.Errorf("Node %s: Expected: %v Actual: %v", (*selectedStorageNode).SchedulerNodeName, + apios.Status_STATUS_OK, status)) + } + } + } else { + UpdateOutcome(event, fmt.Errorf("Failed to find the node!")) + } + for _, ctx := range *contexts { + log.Infof("Validating context: %v", ctx.App.Key) + ctx.SkipVolumeValidation = false + errorChan := make(chan error, errorChannelSize) + ValidateContext(ctx, &errorChan) + for err := range errorChan { + UpdateOutcome(event, err) + } + } + err = ValidateDataIntegrity(contexts) + UpdateOutcome(event, err) + updateMetrics(*event) + }) + }) +} + // TriggerVolumeCreatePXRestart create volume , attach , detach and reboot nodes parallely func TriggerVolumeCreatePXRestart(contexts *[]*scheduler.Context, recordChan *chan *EventRecord) { @@ -2051,7 +2197,7 @@ func TriggerPoolMaintenanceCycle(contexts *[]*scheduler.Context, recordChan *cha func isNodeHealthy(n node.Node, eventType string) error { status, err := Inst().V.GetNodeStatus(n) if err != nil { - log.Errorf("Unable to get Node [%s] status, skipping [%s] for the node", n.Name, eventType) + log.Errorf("Unable to get Node [%s] status, skipping [%s] for the node [%+v]. Error: [%v]", n.Name, eventType, n, err) return err } @@ -2563,7 +2709,7 @@ func TriggerRebootManyNodes(contexts *[]*scheduler.Context, recordChan *chan *Ev Step(stepLog, func() { log.InfoD(stepLog) nodesToReboot := getNodesByChaosLevel(RebootManyNodes) - selectedNodes := make([]node.Node, len(nodesToReboot)) + selectedNodes := make([]node.Node, 0) for _, n := range nodesToReboot { err := isNodeHealthy(n, event.Event.Type) if err != nil { @@ -3354,6 +3500,11 @@ func TriggerCloudSnapShot(contexts *[]*scheduler.Context, recordChan *chan *Even policyName := "intervalpolicy" schedPolicy, err := storkops.Instance().GetSchedulePolicy(policyName) if err != nil { + err = CreatePXCloudCredential() + if err != nil { + UpdateOutcome(event, err) + return + } retain := 10 interval := getCloudSnapInterval(CloudSnapShot) log.InfoD("Creating a interval schedule policy %v with interval %v minutes", policyName, interval) @@ -3481,6 +3632,77 @@ func TriggerCloudSnapShot(contexts *[]*scheduler.Context, recordChan *chan *Even } +//TriggerDeleteCloudsnaps +func TriggerDeleteCloudsnaps(contexts *[]*scheduler.Context, recordChan *chan *EventRecord){ + defer ginkgo.GinkgoRecover() + defer endLongevityTest() + startLongevityTest(DeleteCloudsnaps) + event := &EventRecord{ + Event: Event{ + ID: GenerateUUID(), + Type: DeleteCloudsnaps, + }, + Start: time.Now().Format(time.RFC1123), + Outcome: []error{}, + } + defer func() { + event.End = time.Now().Format(time.RFC1123) + *recordChan <- event + }() + setMetrics(*event) + stepLog := "Delete all cloudsnaps" + Step(stepLog, func() { + log.Infof(stepLog) + var volCloudsnapMap = make(map[string][]string) + for _, ctx := range *contexts { + vols, err := Inst().S.GetVolumeParameters(ctx) + log.Infof("Validating context: %v", ctx.App.Key) + log.Infof("Volumes : %v", vols) + UpdateOutcome(event, err) + for vol, params := range vols { + inspectedVol, err:= Inst().V.InspectVolume(vol) + UpdateOutcome(event, err) + csBksps, err := Inst().V.GetCloudsnapsOfGivenVolume(vol, inspectedVol.Id, params) + UpdateOutcome(event, err) + var cloudsnapIds []string + for _, bk := range csBksps { + cloudsnapIds = append(cloudsnapIds, bk.Id) + } + if len(csBksps) > 0 { + volCloudsnapMap[vol] = cloudsnapIds + err = Inst().V.DeleteAllCloudsnaps(vol,csBksps[0].SrcVolumeId, params) + if err != nil && !strings.Contains(err.Error(), "Key already exists") { + UpdateOutcome(event, err) + } + } + } + } + log.Infof("Wait for 10 minutes") + time.Sleep(600 * time.Second) + for _, ctx := range *contexts { + vols, err := Inst().S.GetVolumeParameters(ctx) + UpdateOutcome(event, err) + for vol, params := range vols { + log.Infof("Volume Name : %s", vol) + inspectedVol, err:= Inst().V.InspectVolume(vol) + UpdateOutcome(event, err) + csBksps, err := Inst().V.GetCloudsnapsOfGivenVolume(vol, inspectedVol.Id, params) + UpdateOutcome(event, err) + cloudsnapIds, ok := volCloudsnapMap[vol] + if ok { + for _, bk := range csBksps { + if slices.Contains(cloudsnapIds, bk.Id ){ + log.Infof("Cloud snap hasn not deleted successfully : %s: vol %s", bk.Id , vol ) + UpdateOutcome(event, fmt.Errorf("Cloud snap has not deleted successfully : %s: vol %s", bk.Id , vol)) + } + } + } + } + } + updateMetrics(*event) + }) +} + // TriggerCloudSnapshotRestore perform in-place cloud snap restore func TriggerCloudSnapshotRestore(contexts *[]*scheduler.Context, recordChan *chan *EventRecord) { @@ -3502,6 +3724,13 @@ func TriggerCloudSnapshotRestore(contexts *[]*scheduler.Context, recordChan *cha *recordChan <- event }() + defer func() { + bucketName, err := GetCloudsnapBucketName(*contexts) + UpdateOutcome(event, err) + err = DeleteCloudSnapBucket(bucketName) + UpdateOutcome(event, err) + }() + setMetrics(*event) stepLog := "Verify cloud snap restore" @@ -5334,11 +5563,15 @@ func isPoolResizePossible(poolToBeResized *opsapi.StoragePool) (bool, error) { updatedPoolToBeResized := pools[poolToBeResized.Uuid] if updatedPoolToBeResized.LastOperation.Status != opsapi.SdkStoragePool_OPERATION_SUCCESSFUL { if updatedPoolToBeResized.LastOperation.Status == opsapi.SdkStoragePool_OPERATION_FAILED { - return nil, false, fmt.Errorf("PoolResize has failed. Error: %s", updatedPoolToBeResized.LastOperation) + if strings.Contains(updatedPoolToBeResized.LastOperation.Msg, "aborting due to unclean volumes") { + log.Warnf("Previous Pool expanison has failed due to unclean volumes [%s], continuing with force option", updatedPoolToBeResized.LastOperation.Msg) + return nil, false, nil + } + return nil, false, fmt.Errorf("previous pool expansion has failed. Error: %s", updatedPoolToBeResized.LastOperation) } log.InfoD("Pool Resize is already in progress: %v", updatedPoolToBeResized.LastOperation) if strings.Contains(updatedPoolToBeResized.LastOperation.Msg, "Will not proceed with pool expansion") { - return nil, false, fmt.Errorf("PoolResize has failed. Error: %s", updatedPoolToBeResized.LastOperation.Msg) + return nil, false, fmt.Errorf("pool resize not possible. Error: %s", updatedPoolToBeResized.LastOperation.Msg) } return nil, true, nil } @@ -6033,7 +6266,7 @@ func TriggerUpdateCluster(contexts *[]*scheduler.Context, recordChan *chan *Even time.Sleep(30 * time.Minute) } - PrintK8sCluterInfo() + PrintK8sClusterInfo() }) Step("validate storage components", func() { @@ -6052,7 +6285,7 @@ func TriggerUpdateCluster(contexts *[]*scheduler.Context, recordChan *chan *Even } // Printing cluster node info after the upgrade - PrintK8sCluterInfo() + PrintK8sClusterInfo() }) // TODO: This currently doesn't work for most distros and commenting out this change, see PTX-22409 @@ -6228,7 +6461,8 @@ func TriggerUpgradeVolumeDriverFromCatalog(contexts *[]*scheduler.Context, recor UpdateOutcome(event, fmt.Errorf("error getting images using URL [%s] and k8s version [%s]. Err: [%v]", upgradeHop, k8sVersion.String(), err)) return } - err = oputil.ValidateStorageCluster(imageList, stc, ValidateStorageClusterTimeout, defaultRetryInterval, true) + storageClusterValidateTimeout := time.Duration(len(node.GetStorageDriverNodes())*9) * time.Minute + err = oputil.ValidateStorageCluster(imageList, stc, storageClusterValidateTimeout, defaultRetryInterval, true) if err != nil { UpdateOutcome(event, fmt.Errorf("error validating storage cluster after upgrade. Err: [%v]", err)) return @@ -6458,6 +6692,124 @@ func TriggerVolumeUpdate(contexts *[]*scheduler.Context, recordChan *chan *Event updateMetrics(*event) } +// TriggerPowerOffVMs +func TriggerPowerOffAllVMs(contexts *[]*scheduler.Context, recordChan *chan *EventRecord) { + defer ginkgo.GinkgoRecover() + defer endLongevityTest() + startLongevityTest(PowerOffAllVMs) + event := &EventRecord{ + Event: Event{ + ID: GenerateUUID(), + Type: PowerOffAllVMs, + }, + Start: time.Now().Format(time.RFC1123), + Outcome: []error{}, + } + defer func() { + event.End = time.Now().Format(time.RFC1123) + *recordChan <- event + }() + setMetrics(*event) + stepLog := "Power off all worker nodes test " + Step(stepLog, func() { + log.Infof(stepLog) + workerNodes := node.GetWorkerNodes() + var numberOfThread int = 5 + var numberOfNodePerThread int + // If number of VMs to restarted is less than numberOfThread then + // only one vm assigned to each thread, else assign len(workerNodes)/numberOfThread + // to per thread + if len(workerNodes) < numberOfThread { + numberOfThread = len(workerNodes) + numberOfNodePerThread = 1 + } else { + numberOfNodePerThread = len(workerNodes) / numberOfThread + } + var counter int = 0 + // Assign vms to every thread. + nodesInThread := make([][]node.Node, numberOfThread) + for t := 0; t < numberOfThread; t++ { + nodesInThread[t] = make([]node.Node, numberOfNodePerThread) + for n := 0; n < numberOfNodePerThread; n++ { + nodesInThread[t][n] = workerNodes[counter] + counter++ + } + } + //Create an additional thread for remainder. Example if 12 VMs, assign first 10 vms to + // 5 threads and assign remaining 2 vms 6th thread. + if counter < len(workerNodes) { + log.Infof("Additional nodes : %d", len(workerNodes)-counter) + additonalThread := make([]node.Node, len(workerNodes)-counter) + var index int = 0 + for counter < len(workerNodes) { + additonalThread[index] = workerNodes[counter] + index++ + counter++ + } + nodesInThread = append(nodesInThread, additonalThread) + numberOfThread++ + } + stepLog = "Power off all worker nodes in batches" + Step(stepLog, func() { + var poweroffwg sync.WaitGroup + for i := 0; i < numberOfThread; i++ { + poweroffwg.Add(1) + go func(nodeList []node.Node) { + defer poweroffwg.Done() + for _, nodeInfo := range nodeList { + log.Infof("Node Name : %v", nodeInfo.Name) + err := Inst().N.PowerOffVM(nodeInfo) + UpdateOutcome(event, err) + } + }(nodesInThread[i]) + } + poweroffwg.Wait() + log.Infof("Completed power off VMs") + log.Infof("Wait for 5 minutes") + time.Sleep(time.Duration(5 * time.Minute)) + }) + stepLog = "Power on all worker nodes" + Step(stepLog, func() { + var poweronwg sync.WaitGroup + log.Infof("Poweron thread starts") + for i := 0; i < numberOfThread; i++ { + poweronwg.Add(1) + go func(nodeList []node.Node) { + defer poweronwg.Done() + for _, nodeInfo := range nodeList { + log.Infof("Node Name : %v", nodeInfo.Name) + err := Inst().N.PowerOnVM(nodeInfo) + UpdateOutcome(event, err) + } + }(nodesInThread[i]) + } + poweronwg.Wait() + log.Infof("Completed power on Nodes") + for _, node := range workerNodes { + err := Inst().S.IsNodeReady(node) + err = Inst().V.WaitDriverUpOnNode(node, Inst().DriverStartTimeout) + UpdateOutcome(event, err) + } + }) + stepLog = "Verify APP, volume staus and check data integrity if enabled" + // //Wait for PX to be up on all worker nodes + Step(stepLog, func() { + for _, ctx := range *contexts { + log.Infof("Validating context: %v", ctx.App.Key) + ctx.SkipVolumeValidation = false + errorChan := make(chan error, errorChannelSize) + ValidateContext(ctx, &errorChan) + for err := range errorChan { + UpdateOutcome(event, err) + } + } + err := ValidateDataIntegrity(contexts) + UpdateOutcome(event, err) + }) + updateMetrics(*event) + }) +} + // TriggerVolumeUpdate enables to test volume update func TriggerVolumeIOProfileUpdate(contexts *[]*scheduler.Context, recordChan *chan *EventRecord) { defer ginkgo.GinkgoRecover() @@ -6693,17 +7045,19 @@ func updateIOPriorityOnVolumes(contexts *[]*scheduler.Context, event *EventRecor func validateAutoFsTrim(contexts *[]*scheduler.Context, event *EventRecord) { for _, ctx := range *contexts { - var appVolumes []*volume.Volume - var err error if strings.Contains(ctx.App.Key, "fstrim") { - appVolumes, err = Inst().S.GetVolumes(ctx) - UpdateOutcome(event, err) + appVolumes, err := Inst().S.GetVolumes(ctx) + if err != nil { + UpdateOutcome(event, fmt.Errorf("error getting volumes for app %s: %v", ctx.App.Key, err)) + continue + } if len(appVolumes) == 0 { UpdateOutcome(event, fmt.Errorf("found no volumes for app %s", ctx.App.Key)) + continue } for _, v := range appVolumes { - // Skip autofs trim status on Pure DA volumes + // Skip autofstrim status on Pure DA volumes isPureVol, err := Inst().V.IsPureVolume(v) if err != nil { UpdateOutcome(event, err) @@ -6715,58 +7069,48 @@ func validateAutoFsTrim(contexts *[]*scheduler.Context, event *EventRecord) { ) continue } - log.Infof("Getting info : %s", v.ID) + + log.Infof("Getting volume %s inspect response", v.ID) appVol, err := Inst().V.InspectVolume(v.ID) if err != nil { - log.Errorf("Error inspecting volume: %v", err) + UpdateOutcome(event, fmt.Errorf("error inspecting volume [%v]: %v", v.ID, err)) + continue } - attachedNode := appVol.AttachedOn - - var fsTrimStatuses map[string]opsapi.FilesystemTrim_FilesystemTrimStatus + attachedNode := appVol.AttachedOn t := func() (interface{}, bool, error) { - fsTrimStatuses, err = Inst().V.GetAutoFsTrimStatus(attachedNode) + fsTrimStatuses, err := Inst().V.GetAutoFsTrimStatus(attachedNode) if err != nil { return nil, true, fmt.Errorf("error autofstrim status node %v status", attachedNode) } - - return nil, false, nil + val, ok := fsTrimStatuses[appVol.Id] + var fsTrimStatus opsapi.FilesystemTrim_FilesystemTrimStatus + if !ok { + fsTrimStatus, _ = waitForFsTrimStatus(event, attachedNode, appVol.Id) + } else { + fsTrimStatus = val + } + log.Infof("autofstrim status for volume %v, status: %v", appVol.Id, val.String()) + if fsTrimStatus != -1 { + if fsTrimStatus == opsapi.FilesystemTrim_FS_TRIM_COMPLETED { + return nil, false, nil + } else if fsTrimStatus == opsapi.FilesystemTrim_FS_TRIM_FAILED { + return nil, false, fmt.Errorf("autoFstrim failed for volume %v, status: %v", v.ID, val.String()) + } else { + return nil, true, fmt.Errorf("current autofstrim status for volume %v is %v. Expected status is %v", v.ID, val.String(), opsapi.FilesystemTrim_FS_TRIM_COMPLETED) + } + } else { + return nil, true, fmt.Errorf("autofstrim for volume %v not started yet", v.ID) + } } _, err = task.DoRetryWithTimeout(t, defaultDriverStartTimeout, defaultRetryInterval) if err != nil { UpdateOutcome(event, err) return } - - val, ok := fsTrimStatuses[appVol.Id] - var fsTrimStatus opsapi.FilesystemTrim_FilesystemTrimStatus - - if !ok { - fsTrimStatus, _ = waitForFsTrimStatus(event, attachedNode, appVol.Id) - } else { - fsTrimStatus = val - } - - if fsTrimStatus != -1 { - - if fsTrimStatus == opsapi.FilesystemTrim_FS_TRIM_FAILED || fsTrimStatus == opsapi.FilesystemTrim_FS_TRIM_STOPPED || fsTrimStatus == opsapi.FilesystemTrim_FS_TRIM_UNKNOWN { - - err = fmt.Errorf("AutoFstrim failed for volume %v, status: %v", v.ID, val.String()) - UpdateOutcome(event, err) - - } else { - log.InfoD("Autofstrim status for volume %v, status: %v", v.ID, val.String()) - - } - } else { - log.Infof("autofstrim for volume %v not started yet", v.ID) - } - } - } } - } func waitForFsTrimStatus(event *EventRecord, attachedNode, volumeID string) (opsapi.FilesystemTrim_FilesystemTrimStatus, error) { @@ -7400,11 +7744,11 @@ func getCloudSnapInterval(triggerType string) int { case 7: interval = 60 case 8: - interval = 30 + interval = 45 case 9: - interval = 20 + interval = 30 case 10: - interval = 10 + interval = 20 } return interval @@ -7513,9 +7857,11 @@ func TriggerKVDBFailover(contexts *[]*scheduler.Context, recordChan *chan *Event nodeMap := node.GetNodesByVoDriverNodeID() nodeContexts := make([]*scheduler.Context, 0) + log.Infof("KVDB node map is [%v]", kvdbNodeIDMap) for kvdbID, nodeID := range kvdbNodeIDMap { kvdbNode := nodeMap[nodeID] + appNodeContexts, err := GetContextsOnNode(contexts, &kvdbNode) nodeContexts = append(nodeContexts, appNodeContexts...) errorChan := make(chan error, errorChannelSize) @@ -7623,27 +7969,30 @@ func TriggerKVDBFailover(contexts *[]*scheduler.Context, recordChan *chan *Event } func validateKVDBMembers(event *EventRecord, kvdbMembers map[string]*volume.MetadataNode, isDestuctive bool) bool { - log.InfoD("Current KVDB members: %v", kvdbMembers) allHealthy := true if len(kvdbMembers) == 0 { - err := fmt.Errorf("No KVDB membes to validate") + err := fmt.Errorf("no KVDB membes to validate") UpdateOutcome(event, err) return false } + log.InfoD("Current KVDB members are") + for _, m := range kvdbMembers { + log.InfoD(m.Name) + } - for id, m := range kvdbMembers { + for _, m := range kvdbMembers { if !m.IsHealthy { - err := fmt.Errorf("kvdb member node: %v is not healthy", id) - allHealthy = allHealthy && false + err := fmt.Errorf("kvdb member node: %v is not healthy", m.Name) + allHealthy = false log.Warn(err.Error()) if isDestuctive { UpdateOutcome(event, err) } } else { - log.InfoD("KVDB member node %v is healthy", id) + log.InfoD("KVDB member node %v is healthy", m.Name) } } @@ -10087,7 +10436,7 @@ func TriggerAddOCPStorageNode(contexts *[]*scheduler.Context, recordChan *chan * dashStats["new-scale"] = fmt.Sprintf("%d", expReplicas) dashStats["storage-node"] = "true" updateLongevityStats(AddStorageNode, stats.NodeScaleUpEventName, dashStats) - err = Inst().S.ScaleCluster(expReplicas) + err = Inst().S.SetASGClusterSize(int64(expReplicas), 10*time.Minute) if err != nil { UpdateOutcome(event, err) isClusterScaled = false @@ -10100,6 +10449,12 @@ func TriggerAddOCPStorageNode(contexts *[]*scheduler.Context, recordChan *chan * return } + err := Inst().S.RefreshNodeRegistry() + UpdateOutcome(event, err) + + err = Inst().V.RefreshDriverEndpoints() + UpdateOutcome(event, err) + stepLog = "validate PX on all nodes after cluster scale up" hasPXUp := true Step(stepLog, func() { @@ -10118,7 +10473,7 @@ func TriggerAddOCPStorageNode(contexts *[]*scheduler.Context, recordChan *chan * return } - err := Inst().V.RefreshDriverEndpoints() + err = Inst().V.RefreshDriverEndpoints() UpdateOutcome(event, err) updatedStorageNodesCount := len(node.GetStorageNodes()) @@ -10216,7 +10571,7 @@ func TriggerAddOCPStoragelessNode(contexts *[]*scheduler.Context, recordChan *ch dashStats["new-scale"] = fmt.Sprintf("%d", expReplicas) dashStats["storage-node"] = "false" updateLongevityStats(AddStoragelessNode, stats.NodeScaleUpEventName, dashStats) - err = Inst().S.ScaleCluster(expReplicas) + err = Inst().S.SetASGClusterSize(int64(expReplicas), 10*time.Minute) if err != nil { UpdateOutcome(event, err) isClusterScaled = false @@ -10228,6 +10583,11 @@ func TriggerAddOCPStoragelessNode(contexts *[]*scheduler.Context, recordChan *ch if !isClusterScaled { return } + err := Inst().S.RefreshNodeRegistry() + UpdateOutcome(event, err) + + err = Inst().V.RefreshDriverEndpoints() + UpdateOutcome(event, err) stepLog = "validate PX on all nodes after cluster scale up" hasPXUp := true @@ -10246,7 +10606,7 @@ func TriggerAddOCPStoragelessNode(contexts *[]*scheduler.Context, recordChan *ch if !hasPXUp { return } - err := Inst().V.RefreshDriverEndpoints() + err = Inst().V.RefreshDriverEndpoints() UpdateOutcome(event, err) updatedStoragelessNodesCount := len(node.GetStorageLessNodes()) @@ -10259,7 +10619,6 @@ func TriggerAddOCPStoragelessNode(contexts *[]*scheduler.Context, recordChan *ch validateContexts(event, contexts) updateMetrics(*event) - } func TriggerOCPStorageNodeRecycle(contexts *[]*scheduler.Context, recordChan *chan *EventRecord) { @@ -10311,6 +10670,19 @@ func TriggerOCPStorageNodeRecycle(contexts *[]*scheduler.Context, recordChan *ch updateLongevityStats(OCPStorageNodeRecycle, stats.NodeRecycleEventName, dashStats) err := Inst().S.DeleteNode(delNode) UpdateOutcome(event, err) + + stepLog = fmt.Sprintf("wait for %s minutes for auto recovery of storeage nodes", + Inst().AutoStorageNodeRecoveryTimeout.String()) + + Step(stepLog, func() { + log.InfoD(stepLog) + time.Sleep(Inst().AutoStorageNodeRecoveryTimeout) + }) + err = Inst().S.RefreshNodeRegistry() + UpdateOutcome(event, err) + + err = Inst().V.RefreshDriverEndpoints() + UpdateOutcome(event, err) }) Step(fmt.Sprintf("Listing all nodes after recycling a storage node %s", delNode.Name), func() { workerNodes := node.GetWorkerNodes() @@ -10348,7 +10720,6 @@ func TriggerOCPStorageNodeRecycle(contexts *[]*scheduler.Context, recordChan *ch validateContexts(event, contexts) updateMetrics(*event) - } // TriggerReallocSharedMount peforms sharedv4 and sharedv4_svc volumes reallocation @@ -10962,6 +11333,246 @@ func TriggerResetDiscardMounts(contexts *[]*scheduler.Context, recordChan *chan }) } +func TriggerScaleFADAVolumeAttach(contexts *[]*scheduler.Context, recordChan *chan *EventRecord) { + defer endLongevityTest() + startLongevityTest(ScaleFADAVolumeAttach) + defer ginkgo.GinkgoRecover() + var wg sync.WaitGroup + + event := &EventRecord{ + Event: Event{ + ID: GenerateUUID(), + Type: ScaleFADAVolumeAttach, + }, + Start: time.Now().Format(time.RFC1123), + Outcome: []error{}, + } + + defer func() { + event.End = time.Now().Format(time.RFC1123) + *recordChan <- event + }() + + setMetrics(*event) + + stepLog := "Adding FADA volumes at scale to validate FADA volumes attachment in scale " + + Step(stepLog, func() { + log.InfoD(stepLog) + var param = make(map[string]string) + var appContexts []*scheduler.Context + sem := make(chan struct{}, 10) + + fadaScName := PureBlockStorageClass + time.Now().Format("01-02-15h04m05s") + log.Infof("Creating pure_block storage class class: %s", fadaScName) + param[PureBackend] = k8s.PureBlock + _, err := createPureStorageClass(fadaScName, param) + if err != nil { + log.Errorf("StorageClass creation failed for SC: %s", fadaScName) + UpdateOutcome(event, err) + } + log.InfoD("Deployng FADA based applications") + startTime := time.Now() + for x := 0; x < deploymentCount; x++ { + pvcName := fmt.Sprintf("%s-%d", pvcNamePrefix, x) + namespace := fmt.Sprintf("%s-%d", fadaNamespacePrefix, x) + deploymentName := fmt.Sprintf("%s-%d", fadaScName, x) + wg.Add(1) + sem <- struct{}{} + go func(scName string, pvcName string, ns string, depName string, wg *sync.WaitGroup, ctx *[]*scheduler.Context, event *EventRecord, sem chan struct{}) { + deployFadaApps(fadaScName, pvcName, namespace, deploymentName, wg, ctx, event) + <-sem + }(fadaScName, pvcName, namespace, deploymentName, &wg, &appContexts, event, sem) + } + wg.Wait() + close(sem) + log.InfoD("Validating applications context") + validateContexts(event, &appContexts) + log.Infof("Attaching [%d] FADA volumes took: [%v]", deploymentCount, time.Since(startTime)) + if time.Since(startTime) > podAttachTimeout { + UpdateOutcome(event, fmt.Errorf("failed to complete all fada pods attachment in [%v]", podAttachTimeout)) + } + + stepLog = "Cleaning up the FADA deployments" + Step(stepLog, func() { + log.InfoD(stepLog) + sem := make(chan struct{}, 10) + for x := 0; x < deploymentCount; x++ { + sem <- struct{}{} + wg.Add(1) + go func(ctx *scheduler.Context, wg *sync.WaitGroup, event *EventRecord, sem chan struct{}) { + cleanupDeployment(ctx, wg, event) + <-sem + }(appContexts[x], &wg, event, sem) + } + wg.Wait() + close(sem) + log.InfoD("Successfully cleaned up the FADA deployments") + }) + updateMetrics(*event) + }) +} + +// deployFadaApps deploy deployment using FADA volumes +func deployFadaApps(scName string, pvcName string, ns string, depName string, wg *sync.WaitGroup, ctx *[]*scheduler.Context, event *EventRecord) { + defer wg.Done() + + metadata := make(map[string]string, 0) + pvcSize := "1Gi" + metadata["app"] = "fada-data-app" + + if err := createNameSpace(ns, metadata); err != nil { + UpdateOutcome(event, fmt.Errorf("failed to create namespace: %s. Err: %v", ns, err)) + } + if err := createPVC(pvcName, scName, pvcSize, ns); err != nil { + UpdateOutcome(event, fmt.Errorf("failed to create pvc: [%s] in ns: [%s]. Err: %v", pvcName, ns, err)) + } + if err := createDeployment(depName, ns, pvcName, ctx); err != nil { + UpdateOutcome(event, fmt.Errorf("failed to create deployment: %s. Err: %v", depName, err)) + } +} + +func createDeployment(depName string, ns string, pvcName string, ctx *[]*scheduler.Context) error { + request := make(map[v1.ResourceName]resource.Quantity, 0) + limit := make(map[v1.ResourceName]resource.Quantity, 0) + cpu, err := resource.ParseQuantity("50m") + if err != nil { + return fmt.Errorf("failed to parse cpu request size. Err: %v", err) + } + memory, err := resource.ParseQuantity("64Mi") + if err != nil { + return fmt.Errorf("failed to parse memory request size. Err: %v", err) + } + request["cpu"], request["memory"] = cpu, memory + + cpuLimit, err := resource.ParseQuantity("100m") + if err != nil { + return fmt.Errorf("failed to parse cpu limit size. Err: %v", err) + } + memLimit, err := resource.ParseQuantity("128Mi") + if err != nil { + return fmt.Errorf("failed to parse memory limit size. Err: %v", err) + } + limit["cpu"], limit["memory"] = cpuLimit, memLimit + deployment := getDeploymentObject(depName, ns, pvcName, request, limit) + deployment, err = apps.Instance().CreateDeployment(deployment, metav1.CreateOptions{}) + if err != nil { + return err + } + + (*ctx) = append(*ctx, &scheduler.Context{ + App: &spec.AppSpec{ + SpecList: []interface{}{deployment}, + }, + }) + return nil +} + +func getDeploymentObject(depName string, ns string, pvcName string, request, limit map[v1.ResourceName]resource.Quantity) *appsapi.Deployment { + var replica int32 = 1 + label := make(map[string]string, 0) + label["app"] = "fada-data-app" + volMounts := []v1.VolumeMount{{ + Name: "fada-data-vol", + MountPath: "/mnt/data"}, + } + volumes := []v1.Volume{{ + Name: "fada-data-vol", + VolumeSource: v1.VolumeSource{ + PersistentVolumeClaim: &v1.PersistentVolumeClaimVolumeSource{ + ClaimName: pvcName, + }}}, + } + commands := []string{ + "sh", "-c", "sleep 3600", + } + + // containers spec + containers := []v1.Container{ + { + Name: "franzlaender", + Image: "ubuntu:latest", + Command: commands, + VolumeMounts: volMounts, + Resources: v1.ResourceRequirements{ + Requests: request, + Limits: limit, + }, + ImagePullPolicy: v1.PullIfNotPresent, + }, + } + return &appsapi.Deployment{ + ObjectMeta: meta_v1.ObjectMeta{ + Name: depName, + Namespace: ns, + }, + Spec: appsapi.DeploymentSpec{ + Replicas: &replica, + Selector: &metav1.LabelSelector{ + MatchLabels: label, + }, + Template: v1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: label, + }, + Spec: v1.PodSpec{ + RestartPolicy: "Always", + Containers: containers, + Volumes: volumes, + }, + }, + }, + } +} + +func createNameSpace(namespace string, label map[string]string) error { + nsSpec := &v1.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + Name: namespace, + Labels: label, + }, + } + _, err := k8sCore.CreateNamespace(nsSpec) + return err +} + +func createPVC(pvcName string, scName string, pvcSize string, ns string) error { + size, err := resource.ParseQuantity(pvcSize) + if err != nil { + return fmt.Errorf("failed to parse pvc size: %s", pvcSize) + } + pvcClaimSpec := k8s.MakePVC(size, ns, pvcName, scName) + _, err = k8sCore.CreatePersistentVolumeClaim(pvcClaimSpec) + return err +} + +func cleanupDeployment(ctx *scheduler.Context, wg *sync.WaitGroup, event *EventRecord) { + defer wg.Done() + defer ginkgo.GinkgoRecover() + var deployment *appsapi.Deployment + var depname, namespace string + if len(ctx.App.SpecList) > 0 { + deployment = ctx.App.SpecList[0].(*appsapi.Deployment) + depname = deployment.ObjectMeta.Name + namespace = deployment.ObjectMeta.Namespace + if err := apps.Instance().DeleteDeployment(depname, namespace); err != nil { + UpdateOutcome(event, fmt.Errorf( + "failed to delete deployment: %s. Err: %v", depname, err)) + } + if len(deployment.Spec.Template.Spec.Volumes) > 0 { + for _, vol := range deployment.Spec.Template.Spec.Volumes { + pvcName := vol.VolumeSource.PersistentVolumeClaim.ClaimName + if err := k8sCore.DeletePersistentVolumeClaim(pvcName, namespace); err != nil { + UpdateOutcome(event, err) + } + } + } + } + if err := k8sCore.DeleteNamespace(namespace); err != nil { + UpdateOutcome(event, err) + } +} + // CreateStorageClass method creates a storageclass using host's k8s clientset on host cluster func CreateVclusterStorageClass(scName string, opts ...storageClassOption) error { params := make(map[string]string) @@ -10992,11 +11603,11 @@ func CreateVclusterStorageClass(scName string, opts ...storageClassOption) error } // GetContextPVCs returns pvc from the given context -func GetContextPVCs(context *scheduler.Context) ([]*corev1.PersistentVolumeClaim, error) { - updatedPVCs := make([]*corev1.PersistentVolumeClaim, 0) +func GetContextPVCs(context *scheduler.Context) ([]*v1.PersistentVolumeClaim, error) { + updatedPVCs := make([]*v1.PersistentVolumeClaim, 0) for _, specObj := range context.App.SpecList { - if obj, ok := specObj.(*corev1.PersistentVolumeClaim); ok { + if obj, ok := specObj.(*v1.PersistentVolumeClaim); ok { pvc, err := k8sCore.GetPersistentVolumeClaim(obj.Name, obj.Namespace) if err != nil { return nil, err @@ -11251,4 +11862,4 @@ $('#pxtable tr td').each(function(){